2010-01-28 26 views
3

這裏是我的表X:MySQL的SELECT IN從字符串

id  vals 
--------------------- 
1  4|6|8| 

現在表Y:

id  name 
-------------------- 
1  a 
4  b 
6  c 
8  d 

現在我想以下幾點:

select * from Y where id IN (replace(select vals from X where id = '1'),'|',',') 

但這似乎並不上班。任何想法爲什麼?

回答

6

您可以使用FIND_IN_SET,而不是僅僅IN,正常IN關鍵字一個領域內的逗號分隔值之間無法進行搜索。

例如

mysql> select FIND_IN_SET(4, replace('4|6|8|','|',',')); 

+-------------------------------------------+ 
| FIND_IN_SET(4, replace('4|6|8|','|',',')) | 
+-------------------------------------------+ 
|           1 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 
+0

這絕對是比正則表達式更簡潔;我喜歡SO的原因之一是發現了一些我以前從未見過的方便的東西。 :) – Amber 2010-01-28 09:18:45

+0

@Dav完全是我的想法,+1 S.Mark爲此。 – Mike 2010-01-28 09:20:56

+0

完美。謝謝。 – 2010-01-28 10:01:46

0

替換爲您提供了一個字符串返回 - 但它是一個字符串值,而不是您的查詢的一部分字符串。

你可以做什麼,而不是使用IN,使用正規您的原始字符串中匹配,例如:僅當有一個「4」的原始字符串

vals REGEXP '[[:<:]]4[[:>:]]' 

將是真實的,不是更大數字的一部分(因此,如果您有3 | 44 | 100,它將不匹配「4」,但會匹配「44」)。

[[:<:]][[:>:]]分別是「單詞的左側」和「單詞的右側」。

要生成的字符串,你可以這樣做......

CONCAT('[[:<:]]', CAST(id AS CHAR), '[[:>:]]')