ORACLE SQL 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

我有一个以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_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