2017-02-07 61 views
0

我有一个以CSV值作为列的表。我希望在where子句中使用该列来比较是否存在CSV的子集。例如表具有类似于值ORACLE SQL CSV列比较

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

查询:

从标签

选择id其中csv_column包含 '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,

回答

1

为此,可以使用LIKE,确保搜索三种类型,对每个字母/子模式,你打算匹配处理,,A,,A出现在CSV列中。

我们还可以使用INSTR()代替LIKE来编写结构类似的查询,它甚至可以提高使用通配符的性能。

+0

你需要一些括号,否则AND将不会按预期工作 –

+0

@ChristianPalmer感谢您的编辑。 –

+0

谢谢@TimBiegeleisen – Srini2k6

0

有可能是一些时髦的你可以用正则表达式,但简单来说做...如果A和C总是会在这个顺序

csv_column LIKE '%A%C%' 

否则

(csv_column LIKE '%A%' AND csv_column LIKE '%C%') 
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', ',', '%') || '%' 

会给没有结果

0

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