2017-02-07 103 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

爲什麼不值存儲爲單獨的列,然後用簡單的謂詞過濾?