是否可以查询逗号分隔列的特定值?

And*_*ndy 2 sql csv oracle ora-00904 denormalized

我有(并且不拥有,所以我无法更改)具有类似于此的布局的表.

ID | CATEGORIES
---------------
1  | c1
2  | c2,c3
3  | c3,c2
4  | c3
5  | c4,c8,c5,c100
Run Code Online (Sandbox Code Playgroud)

我需要返回包含特定类别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陈述.我FIND_IN_SET()在Oracle文档中找到了,但它似乎不适用于10g.我收到以下错误:

ORA-00904: "FIND_IN_SET": invalid identifier
00904. 00000 -  "%s: invalid identifier"
Run Code Online (Sandbox Code Playgroud)

运行此查询时:( SELECT id FROM table WHERE FIND_IN_SET('c2', categories);来自文档的示例)或此查询:( SELECT id FROM table WHERE FIND_IN_SET('c2', categories) <> 0;来自Google的示例)

我希望它能返回第2行和第3行.

有没有更好的方法来编写这些查询而不是使用大量的LIKE语句?

Gol*_*rol 11

你可以使用LIKE.您不希望匹配部分值,因此您必须在搜索中包含逗号.这也意味着您必须提供额外的逗号来搜索文本开头或结尾的值:

select 
  * 
from
  YourTable 
where 
  ',' || CommaSeparatedValueColumn || ',' LIKE '%,SearchValue,%'
Run Code Online (Sandbox Code Playgroud)

但是这个查询会很慢,所有使用LIKE的查询都会很慢,尤其是使用前导通配符.

并且始终存在风险.如果值周围有空格,或者值本身可以包含逗号,在这种情况下它们被引号括起来(比如在csv文件中),此查询将无法工作,您将不得不添加更多逻辑,从而减慢查询速度更.

更好的解决方案是为这些类别添加子表.或者更确切地说,甚至是单独的catagories表,以及将它们交叉链接到YourTable的表.