我有一个名为category_ids (text)
的表字段,它将另一个表的ID保存为"1,2,3"
。
现在我想将此category_ids
用于sql IN()
查询。查询将类似于tab1.category_id IN (select category_ids from tab2)
。但我遇到问题,因为select category_ids from tab2
会返回'1,2,3'
,因此IN()
查询无效。
有没有简单的方法可以在sql中将'1,2,3'
转换为('1','2','3')
或(1,2,3)
?
答案 0 :(得分:1)
您可以在此处使用FIND_IN_SET
:
SELECT *
FROM tab1
WHERE FIND_IN_SET(tab1.category_id,
(select category_ids from tab2));
这只是一个示例查询,您的实际查询可能会有所不同。但问题是,如果您想在CSV字符串'1'
中搜索'1,2,3'
,那么就有办法实现。{/ p>
正如其他人已经提到的那样,您应该避免在表格中存储CSV数据。当我看到FIND_IN_SET
被大量使用时,通常会有一股气味。
答案 1 :(得分:0)
如果table2
有多行,您可以将exists
与find_in_set()
一起使用:
select t1.*
from table1 t1
where exists (select 1
from table2 t2
where find_in_set(t1.category_id, t2.category_ids) > 0
);
请注意,这是一个非常糟糕的数据结构。 table2
中的每个类别ID都应该有一行。如果你这样做了,那么查询会更简单,性能更好。