2017-02-07 8 views
0

私は列としてCSV値を持つテーブルを持っています。 CSVのサブセットが存在するかどうかを比較するwhere句でその列を使用します。例えばテーブルのような値を有するORACLE SQL CSV列の比較

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

クエリ:

csv_columnが含まれているタブから

選択ID 'Aを、C'

このクエリは1を返します。

これをSQLで実現するには?

答えて

1

あなたが一致する各文字/ストリングのためのパターンの3種類を検索することを確認して、LIKEを使用してこれを扱うことができます:サブAのために一致し

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がCSV列に表示されます。

LIKEの代わりにINSTR()を使用して構造的に類似したクエリを書き込むこともできます。これは、ワイルドカードを使用してもさらに性能が向上する可能性があります。

+0

そこにいくつかの括弧が必要です。そうでなければ、ANDは意図したとおりに動作しません。 –

+0

@ChristianPalmer編集をありがとう。 –

+0

ありがとう@TimBiegeleisen – Srini2k6

0

あなたはドン場合は、AとCは常にそう

(csv_column LIKE '%A%' AND csv_column LIKE '%C%') 
0

そのため

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

ができます:

 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

を与えないだろうか?