Oracle IN句でLIKEを使用する 質問する

Oracle IN句でLIKEを使用する 質問する

次のように、特定の列に任意の数の値を含むすべての行を返すクエリを作成できることはわかっています。

Select * from tbl where my_col in (val1, val2, val3,... valn)

しかしval1、たとえば、my_colデータ型がvarchar(300)である が 内のどこにでも出現できる場合は、代わりに次のように記述します。

select * from tbl where my_col LIKE '%val1%'

これら 2 つの手法を組み合わせる方法はありますか。列の自由形式のテキストのどこにでも出現する可能性のある 30 個程度の値を検索する必要があります。

これら 2 つのステートメントを次のように組み合わせても機能しないようです。

select * from tbl where my_col LIKE ('%val1%', '%val2%', 'val3%',....) 

select * from tbl where my_col in ('%val1%', '%val2%', 'val3%',....)

ベストアンサー1

ここで役に立つのはLIKE ANYPostgreSQLで利用可能な述語

SELECT * 
FROM tbl
WHERE my_col LIKE ANY (ARRAY['%val1%', '%val2%', '%val3%', ...])

残念ながら、その構文は Oracle では使用できません。ただし、 を使用して定量比較述語を拡張できますOR

SELECT * 
FROM tbl
WHERE my_col LIKE '%val1%' OR my_col LIKE '%val2%' OR my_col LIKE '%val3%', ...

あるいは、EXISTS述語と補助配列データ構造(詳細についてはこの質問を参照してください):

SELECT *
FROM tbl t
WHERE EXISTS (
  SELECT 1
  -- Alternatively, store those values in a temp table:
  FROM TABLE (sys.ora_mining_varchar2_nt('%val1%', '%val2%', '%val3%'/*, ...*/))
  WHERE t.my_col LIKE column_value
)

真の全文検索については、Oracle Text を検討してください。http://www.oracle.com/technetwork/database/enterprise-edition/index-098492.html

おすすめ記事