我有一个以CSV值为列的表格。我想在where子句中使用该列来比较CSV的子集是否存在。例如,Table的值类似于
1| 'A,B,C,D,E'
查询:
从标签中选择ID csv_column包含' A,C' ;
此查询应返回1.
如何在SQL中实现这一点?
答案 0 :(得分:1)
您可以使用LIKE
处理此问题,确保为您要匹配的每个字母/子字符串搜索三种类型的模式:
SELECT id
FROM yourTable
WHERE (csv_column LIKE 'A,%' OR csv_column LIKE '%,A,%' OR csv_column LIKE '%,A')
AND
(csv_column LIKE 'C,%' OR csv_column LIKE '%,C,%' OR csv_column LIKE '%,C')
请注意,匹配子字符串A
表示CSV列中会显示A,
,,A,
或,A
。
我们也可以使用INSTR()
代替LIKE
编写一个结构相似的查询,这甚至可以提高使用通配符的性能。
答案 1 :(得分:0)
可能你可以使用正则表达式做一些时髦的东西,但简单来说......如果A和C总是按顺序排列
csv_column LIKE '%A%C%'
,否则
(csv_column LIKE '%A%' AND csv_column LIKE '%C%' )
答案 2 :(得分:0)
如果您不想编辑搜索字符串,可能会这样:
select *
from yourTable
where csv like '%' || replace('A,C', ',', '%') || '%'
例如:
with yourTable(id, csv) as (
select 1, 'A,B,C,D,E' from dual union all
select 2, 'A,C,D,E' from dual union all
select 3, 'B,C,D,E' from dual
)
select *
from yourTable
where csv like '%' || replace('A,C', ',', '%') || '%'
给出:
ID CSV
---------- ---------
1 A,B,C,D,E
2 A,C,D,E
考虑到这只有在搜索字符串中的字符与CSV列的顺序相同时才有效;例如:
with yourTable(id, csv) as (
select 1, 'C,A,B' from dual
)
select *
from yourTable
here csv like '%' || replace('A,C', ',', '%') || '%'
不会给出任何结果
答案 3 :(得分:0)
为什么不将值存储为单独的列,然后使用简单的谓词过滤?