私は列としてCSV値を持つテーブルを持っています。 CSVのサブセットが存在するかどうかを比較するwhere句でその列を使用します。例えばテーブルのような値を有するORACLE SQL CSV列の比較
1| 'A,B,C,D,E'
クエリ:
csv_columnが含まれているタブから選択ID 'Aを、C'。
このクエリは1を返します。
これをSQLで実現するには?
私は列としてCSV値を持つテーブルを持っています。 CSVのサブセットが存在するかどうかを比較するwhere句でその列を使用します。例えばテーブルのような値を有するORACLE SQL CSV列の比較
1| 'A,B,C,D,E'
クエリ:
csv_columnが含まれているタブから選択ID 'Aを、C'。
このクエリは1を返します。
これをSQLで実現するには?
あなたが一致する各文字/ストリングのためのパターンの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()
を使用して構造的に類似したクエリを書き込むこともできます。これは、ワイルドカードを使用してもさらに性能が向上する可能性があります。
あなたはドン場合は、AとCは常にそう
(csv_column LIKE '%A%' AND csv_column LIKE '%C%')
そのため
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', ',', '%') || '%'
なぜ別々の列として値を格納し、その後、単純な述語のフィルタを使用していない結果
を与えないだろうか?
そこにいくつかの括弧が必要です。そうでなければ、ANDは意図したとおりに動作しません。 –
@ChristianPalmer編集をありがとう。 –
ありがとう@TimBiegeleisen – Srini2k6