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的表.
| 归档时间: |
|
| 查看次数: |
15496 次 |
| 最近记录: |