这是我的表X:
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'),'|',',')
但这似乎不起作用。有什么想法吗?
答案 0 :(得分: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)
答案 1 :(得分:0)
Replace会给你一个字符串 - 但它是一个字符串值,而不是你查询中的字符串。
您可以做的不是使用IN
,而是使用REGEXP匹配原始字符串,例如:
vals REGEXP '[[:<:]]4[[:>:]]'
只有在原始字符串中有一个不是较大数字的一部分的“4”时才会成立(因此,如果你有3 | 44 | 100,它将不匹配“4”但会匹配“44”)。
[[:<:]]
和[[:>:]]
分别是“单词的左侧”和“单词的右侧”。
要生成该字符串,您可以执行类似......
的操作CONCAT('[[:<:]]', CAST(id AS CHAR), '[[:>:]]')