複数のオプションのパラメータに対してクエリを実行するためのユースケースがあります。クエリの実行中にいくつかのパラメータが渡される場合とされない場合があります。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値を保持することができます。
NVL(SOME_COLUMN)のようにテーブルの列に関数を適用すると、オプティマイザが制限されることがあります。この場合、関数ベースの索引を作成できます。あなたのテーブルがどのようなものか、あなたが持っているインデックスなどが分かりませんので、助けてください。 – OldProgrammer
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
この例ではユーザ入力が「NULL」の場合、「UNION ALL」の最初のメンバはすべてを取得し、2番目のメンバはすぐに空として認識されます。入力が「NULL」でなければ、最初のメンバーはすぐに空として認識され、2番目のメンバーは「EMPNO」のインデックスを利用することができる。 – mathguy