ORACLE SQL CSV列比较
我有一个以CSV值作为列的表。我想在where子句中使用该列来比较CSV子集是否存在。例如,表的值如下ORACLE SQL CSV列比较,sql,oracle,csv,Sql,Oracle,Csv,我有一个以CSV值作为列的表。我想在where子句中使用该列来比较CSV子集是否存在。例如,表的值如下 1| 'A,B,C,D,E' 查询: 从选项卡中选择id,其中csv_列包含“A,C” 此查询应返回1 如何在SQL中实现这一点?您可以使用类似于的处理此问题,确保为要匹配的每个字母/子字符串搜索三种类型的模式: SELECT id FROM yourTable WHERE (csv_column LIKE 'A,%' OR csv_column LIKE '%,A,%' OR csv_co
1| 'A,B,C,D,E'
查询:
从选项卡中选择id,其中csv_列包含“A,C”
此查询应返回1
如何在SQL中实现这一点?您可以使用类似于的
处理此问题,确保为要匹配的每个字母/子字符串搜索三种类型的模式:
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
的匹配意味着A、
、、A、
或,A
出现在CSV列中
我们也可以使用INSTR()
来编写结构类似的查询,而不是像这样的,这甚至可能会比使用通配符提高性能。正则表达式可能有一些奇怪的功能,但简单来说。。。如果A和C总是按照这个顺序
csv_column LIKE '%A%C%'
否则
(csv_column LIKE '%A%' AND csv_column LIKE '%C%' )
如果不想编辑搜索字符串,可以采用以下方法:
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', ',', '%') || '%'
with yourTable(id, csv) as (
select 1, 'C,A,B' from dual
)
select *
from yourTable
here 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, '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', ',', '%') || '%'
with yourTable(id, csv) as (
select 1, 'C,A,B' from dual
)
select *
from yourTable
here csv like '%' || replace('A,C', ',', '%') || '%'
将不会给出结果为什么不将值存储为单独的列,然后使用简单的谓词筛选?您需要在其中使用一些括号,否则将无法正常工作感谢@TimBiegeleisen