ORACLE SQL CSV列比较

时间:2017-02-07 10:31:42

标签: sql oracle csv

我有一个以CSV值为列的表格。我想在where子句中使用该列来比较CSV的子集是否存在。例如,Table的值类似于

1| 'A,B,C,D,E'

查询:

从标签中选择ID csv_column包含' A,C' ;

此查询应返回1.

如何在SQL中实现这一点?

4 个答案:

答案 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)

为什么不将值存储为单独的列,然后使用简单的谓词过滤?