2016-06-16 13 views
1

LIKE%:myParam%を使用して行を選択する場合は、クエリパラメータに基づいて、nullまたは空でない場合のみを選択します。 クエリパラメータがnullまたは空の場合、すべてのレコードを選択します。& Like %%を削除します。 どうすればいいですか?私は大文字と小文字を区別して試してみましたが、使用方法がわかりません。基本的には、ヌルチェックの結果に基づいて好きなものを使いたいです。SQL - クエリパラメータに基づく条件付きLIKE式

私はこのようなものがあります。たとえば

Select * from myTable tbl 
WHERE tbl.myCol LIKE '%' || :myParam|| '%' 

を: - :MYPARAMがnullであるmytableはから を選択*は、10行を返す4行はmyCol =ヌルを持っているから、 を場合、私は10行を選択します/空の場合はLIKE式に一致する行を取得したい私はあなたが空の文字列にNULL値を変更するためにCOALESCE()を使用できるように表現LIKE '%%'は、(少なくとも、それは、MySQLでない)すべてのレコードを返すことを信じていMYPARAM

+0

'tbl.myCol LIKE '%' || nvl(:myParam、tbl.myCol)|| '%' ' –

答えて

2

元のクエリが機能するはずです。スペースを渡すかどうかを確認する:myParam。

Select * from myTable tbl 
WHERE tbl.myCol LIKE '%' || :myParam|| '%' 

たとえば、次のクエリを実行すると、すべてのテーブルのリストが返されます。

SELECT table_name FROM user_tables 
WHERE table_name like '%' || '' || '%' 

そして、次のクエリはTEMPという単語を含むすべてのテーブルのリストを返します。

SELECT table_name FROM user_tables 
WHERE table_name like '%' || trim('TEMP') || '%' 

myParamの周囲にトリムを入れてみることができます。

Select * from myTable tbl 
WHERE tbl.myCol LIKE '%' || trim(:myParam) || '%' 

このクエリは、列にNULL値が含まれている行を含めるために使用してください。

SELECT * from myTable tbl 
WHERE (tbl.myCol LIKE '%' || :myParam|| '%' 
OR (TRIM(:myParam) IS NULL AND tbl.myCol IS NULL)) 
+0

上記のクエリは、nullがパラメータとして指定されている場合、myColにnullを持つ行を除外します。次の場合はすべての行を選択します。myParam = null、else if:myParamがnullでない場合、LIKEエフェクションに基づいて行を選択します。 – zeppelin

+0

@zeppelinこの回答は私には正しいと思われますが、おそらくクエリ/データに問題があります。 –

+0

@TimBiegeleisenあなたの答えに関するコメントをお読みください。私はそれをより良く説明するための例を追加しました。 – zeppelin

3

:私は、nullが渡されたかのように6行を取得したいいけません:このアプローチについて

SELECT * 
FROM myTable tbl 
WHERE tbl.myCol LIKE '%' || COALESECE(:myParam, '') || '%' 

いいことは、それが厄介CASE式、またはそれよりも、おそらくより悪いものを避けることです。

+0

上記のクエリを使用すると、NULL項目もフィルタリングされ、null以外の列の行のみが返されます。私はnullの行を取得したい場合も:myParamはnull /空ですelse私は:myParamに基づいてフィルタを適用したいです。 – zeppelin

+0

例:select * from myTableは10行を返します.4行にはmyCol = nullがあります。myParamがnull/emptyの場合は10行を選択します。そうでない場合はLIKEと一致する行を取得します。 myParamでnullを渡すと、クエリを使用して6行が返されます。 – zeppelin

+0

あなたは ':myParam'の中に何か他のものがあると思います。私の質問がAFAIKのために働いているはずです。 –

関連する問題