我有一个包含像这样的字符串的字段:
["688024","688023","688025"]
每个值都与另一个表中的ID相关。我可以这样删除括号和引号:
SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456
这给了我
688024,688023,688025
然后我想像这样在IN
语句中使用它:
SELECT * FROM myOtherTable WHERE myOtherID IN (SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456)
但是,它仅返回1个结果,即ID 688024(第一个)。如果执行以下操作,我会得到3个结果:
SELECT * FROM myOtherTable WHERE myOtherID IN (688024,688023,688025)
为什么子查询只会给我1个结果?谢谢。
答案 0 :(得分:2)
您可以使用FIND_IN_SET
:
SELECT *
FROM myOtherTable t1
WHERE EXISTS (SELECT 1 FROM myTable t2
WHERE myID = 123456 AND
FIND_IN_SET(t1.myOtherID,
REPLACE(REPLACE(REPLACE(myField, '"', ""), '[', ''), ']', '')) > 0);
但是请注意,由于要存储CSV数据,因此您当前的表格设计欠佳。 myTable
表的一种更好的方法是将每个myField
值放在单独的行中,如下所示:
myID | myField
123456 | 688024
123456 | 688023
123456 | 688025
然后,您只需要一个简单得多的查询:
SELECT *
FROM myOtherTable t1
WHERE EXISTS (SELECT 1 FROM myTable t2
WHERE myID = 123456 AND t1.myOtherID = t2.myField);
答案 1 :(得分:0)
您确定WHERE myID = 123456
与您要实现的目标没有冲突吗?在我看来,这是导致问题的原因,它仅返回具有此类ID的记录。