我有(并没有拥有,所以我不能改变)与此类似的布局表。是否可以查询逗号分隔的列以获取特定值?
ID | CATEGORIES
---------------
1 | c1
2 | c2,c3
3 | c3,c2
4 | c3
5 | c4,c8,c5,c100
我需要返回包含特定类别ID的行。我写与LIKE语句查询开始,因为这些值可以是字符串中的任何
SELECT id FROM table WHERE categories LIKE '%c2%';
将返回行2和3
SELECT id FROM table WHERE categories LIKE '%c3%' and categories LIKE '%c2%';
会再次让我行2和3,但不为行4
SELECT id FROM table WHERE categories LIKE '%c3%' or categories LIKE '%c2%';
会再次让我行2,3,4
我不喜欢所有的LIKE
语句。我在Oracle文档中找到FIND_IN_SET()
,但它似乎在10g中不起作用。我收到以下错误:
ORA-00904: "FIND_IN_SET": invalid identifier
00904. 00000 - "%s: invalid identifier"
运行此查询时
:SELECT id FROM table WHERE FIND_IN_SET('c2', categories);
(例如,从文档)或该查询:SELECT id FROM table WHERE FIND_IN_SET('c2', categories) <> 0;
(例如,从谷歌)
我希望它返回行2和3。
是否有更好的方式来编写这些查询,而不是使用大量的LIKE
语句?
同样,这就是为什么您不在关系数据库中放置CSV或其他序列化值的原因之一。 – NullUserException
另外'FIND_IN_SET'是一个MySQL函数,不会与Oracle – NullUserException
一起工作......并且与您看起来一样糟糕,实际上更糟糕。除非您稍后过滤结果;你不能只搜索LIKE'%c2%' - 你实际上应该以这种方式指定每一个:“... where(categories ='c2'或类别'%,c2'或类别'%c2 ,'%'或类别'c2,%')。除非你这样做,否则你会匹配'c20','c201'等。 – Gerrat