2017-07-27 5 views
0

複数のオプションのパラメータに対してクエリを実行するためのユースケースがあります。クエリの実行中にいくつかのパラメータが渡される場合とされない場合があります。Oracle SQLクエリのオプションパラメータのパフォーマンス

これまでのところ、私は2つのソリューションを考え出しました。どちらが優れているかを理解する上で助けが必要ですか?または、他の代替ソリューションがありますか?

user_passed_variable IS NULL OR SOME_COLUMN = user_passed_variable 

NVL(SOME_COLUMN, ’null’) = NVL(user_passed_variable, NVL(SOME_COLUMN, ’null’)) 

:カラムもNULL値を保持することができます。

+0

NVL(SOME_COLUMN)のようにテーブルの列に関数を適用すると、オプティマイザが制限されることがあります。この場合、関数ベースの索引を作成できます。あなたのテーブルがどのようなものか、あなたが持っているインデックスなどが分かりませんので、助けてください。 – OldProgrammer

+0

2つの条件を 'OR'で区切っておくと、' SOME_COLUMN'にインデックスを使用できなくなります。 'NVL(SOME_COLUMN、 'null')'も別の 'NVL()'呼び出しの中に埋め込まれているので、関数呼び出しも同様です(関数ベースのインデックスがどのように役立つかははっきりしません)。インデックスを使用できるソリューションがあるかもしれません。たとえば、 'EMPNO = 'または ' 'がNULLである' EMP'から行を選択したいとしたら: 'select * from EMP where はnullです。UNION ALL select * from EMP where EMPNO = ' – mathguy

+0

この例ではユーザ入力が「NULL」の場合、「UNION ALL」の最初のメンバはすべてを取得し、2番目のメンバはすぐに空として認識されます。入力が「NULL」でなければ、最初のメンバーはすぐに空として認識され、2番目のメンバーは「EMPNO」のインデックスを利用することができる。 – mathguy

答えて

0

通常、私は次のようにします。

SELECT * FROM MY_TABLE WHERE SOME_COLUMN = NVL(user_passed_variable,SOME_COLUMN); 

user_passed_variableがNULLの場合、それはすべての行を取得し、user_passed_variableが設定されている場合ならば、それはインデックスに

作品を使用してのみ指定された行をフェッチしますSOME_COLUMNにはnull値がありません

0

フィルタクエリは、ユーザーがオプションの値を指定した場合はフィルタに追加します。それ以外の場合はフィルタに追加しないでください。ユーザー渡された値は、デシベルと一致していると、そのユーザーによって与えられた入力に基づいてテーブルを検索しているクエリのこのタイプを使用して

Select * from Filter_table where 
(user_passed_value1 is null or column1 = user_passed_value1) and 
(user_passed_value2 is null or column2 = user_passed_value2) 

値。

関連する問題