求助获取这样的数据

BENNEE 发布于 2011/09/22 12:10
阅读 459
收藏 0
SQL



获取到star为39的id(即2,3,5),要怎么写?

加载中
1
鉴客
鉴客

不考虑性能的话(性能相当糟):

SELECT id FROM xxxx WHERE star = '39' OR star LIKE '39,%' OR star LIKE '%,39'
0
BENNEE
BENNEE

引用来自“鉴客”的答案

不考虑性能的话(性能相当糟):

SELECT id FROM xxxx WHERE star = '39' OR star LIKE '39,%' OR star LIKE '%,39'
性能还是得考虑的,不过谢谢你的方法
0
sniperBlank
sniperBlank
你这样设计数据库本身就是有问题的。把简单问题复杂化了。
0
狼狼A狗
狼狼A狗
like '%39%' ?
hchen1982
hchen1982
直接 like '%39%'好像不行,比如 139,239什么也会查询出来。 不考虑性能的话,1楼的方法可行
0
hchen1982
hchen1982
SELECT id FROM xxxx WHERE star = '39' OR star LIKE '39,%' OR star LIKE '%,39' OR star LIKE '%,39,%'

不考虑性能的话
0
liunan
liunan

提供给你一个sql,看看你能不能找到灵感:

用逗号等字符隔开的字符串转换成列表

WITH A AS (SELECT '香港,张家港,北京,上海' A FROM DUAL)
SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city  FROM
(
SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 C
FROM(
SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM A
CONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1
)
)

输出结果是:
香港
张家港
北京
上海


 

0
Y-QTCe
Y-QTCe

引用来自“liunan”的答案

提供给你一个sql,看看你能不能找到灵感:

用逗号等字符隔开的字符串转换成列表

WITH A AS (SELECT '香港,张家港,北京,上海' A FROM DUAL)
SELECT DECODE(B,0,SUBSTR(A,C),SUBSTR(A,C,B-C)) city  FROM
(
SELECT A,B,(LAG(B,1,0) OVER(ORDER BY LV))+1 C
FROM(
SELECT A,INSTR(A,',',1,LEVEL) B,LEVEL LV FROM A
CONNECT BY LEVEL <=(LENGTH(A) - LENGTH(REPLACE(A,',','')))+1
)
)

输出结果是:
香港
张家港
北京
上海


 

楼上的解法很巧妙,让人叫绝。

顺着这个思路的话,解决楼主问题的完整语句可以是这样的:

 WITH ta AS(

 SELECT 1  AS ID,'2' AS star FROM dual

 UNION

 SELECT 2 AS ID,'39,44' AS star FROM dual

 UNION

 SELECT 3 AS ID,'39' AS star FROM dual

 UNION

 SELECT 4 AS ID,'74' AS star FROM dual

 UNION

 SELECT 5 AS ID,'9,39' AS star FROM dual

 UNION

 SELECT 6 AS ID,'' AS star FROM dual

)SELECT ID  FROM (

SELECT ID,DECODE(B,0,SUBSTR(star,C),SUBSTR(star,C,B-C)) star  FROM

(

SELECT id,star,B,(LAG(B,1,0) OVER(PARTITION BY ID ORDER BY LV))+1 C

FROM(

SELECT  ta.id ID,ta.star star,INSTR(ta.star,',',1,LEVEL) B,LEVEL LV FROM ta

CONNECT BY LEVEL <=(LENGTH(ta.star) - LENGTH(REPLACE(ta.star,',','')))+1

)

) ) tb WHERE tb.star ='39' ORDER BY ID

 

至于执行效率怎样就不知道了,楼主可以测试下看看……

 

BENNEE
BENNEE
这个没看懂
0
穿衣服比较麻烦
穿衣服比较麻烦

mysql可以用match来检索,一条SQL能搞定。

mssql就麻烦了,需要写个小函数一类的。

1、通过视图或根源上,star字段前后各加一个逗号。

2、直接like %,39,%

效率想高的话,全文检索了要。

0
BENNEE
BENNEE

引用来自“memeyang”的答案

你这样设计数据库本身就是有问题的。把简单问题复杂化了。

我想你是理解我的意思了,这个其实类似OSC的帖子属于多个软件
请问我在1楼的数据库存在什么问题?不吝请教

0
sniperBlank
sniperBlank

引用来自“摇滚21”的答案

引用来自“memeyang”的答案

你这样设计数据库本身就是有问题的。把简单问题复杂化了。

我想你是理解我的意思了,这个其实类似OSC的帖子属于多个软件
请问我在1楼的数据库存在什么问题?不吝请教

star这个字段这样设计不觉得存在问题?这种存储数据的方式性能肯定是高不到哪里去的。

为什么不这样设计呢?

id star

1   2

2  39

3  44

.......

 

返回顶部
顶部