所以我的数据格式如:1 ;; 2;然后我需要在查询中使用这个数字,所以我认为我将它转换为1,2并在IN条件下使用它。在我的表中,结果应返回2行,但它只返回1行。
我的查询是这样的。子查询返回1,2没有问题,但只检索了1行。
select *
from wt_lists
where id IN ((select replace (replace(sendto, ';;',','),';','')
from wt_stats where statsid IN (1)))
但是当我尝试这个时。它返回正确的结果,在我的例子中是2行。
select *
from wt_lists
where id IN (1,2)
我在这里缺少什么?
答案 0 :(得分:3)
需要在查询中显式定义逗号分隔的字符串才能在IN
子句中使用 - 在SO上有无数的例子,人们需要使用动态SQL来合并用户提交的逗号分隔字符串。
那就是说,我有一个使用FIND_IN_SET function的解决方案:
SELECT DISTINCT wl.*
FROM WT_LISTS wl
JOIN (SELECT REPLACE(REPLACE(ws.sendto, ';;',','),';','') AS ids
FROM WT_STATS ws
WHERE ws.statsid = 1) x ON FIND_IN_SET(wl.id, x.ids) > 0
答案 1 :(得分:1)
您正在替换字符串:
';1;;2;'
要:
'1,2'
因此,您的SQL查询如下所示:
select * from wt_lists where id IN ('1,2') from wt_stats where statsid IN (1)
要使用IN子句,您需要在不同的行中选择不同的值。
我发现这个商店程序完全符合你的需要。
http://kedar.nitty-witty.com/blog/mysql-stored-procedure-split-delimited-string-into-rows/
我没有测试过,但是就是这样。
Obs:就像David在上面的评论中所说,解析应用程序中的数据是一种更好的方法。