sql >> データベース >  >> RDS >> Oracle

バインドとnull値でOracleインデックスをヒットするための最良のクエリ

    列と値を比較して、両方がnullかどうかを確認できます。または両方がnullではなく等しい:

    SELECT * FROM MYTABLE 
    WHERE ((A is null and :1 is null) or A = :1) 
      AND ((B is null and :2 is null) or B = :2) 
      AND ((C is null and :3 is null) or C = :3) 
      AND ((D is null and :4 is null) or D = :4) 
      AND ((E is null and :5 is null) or E = :5) 
    

    これはひどくきれいではありませんが、うまくいくはずです。値をnullと同等に比較することはできないことをすでにご存知のとおり、is 演算子。

    クライアントソフトウェアによっては、名前付きバインド変数を使用して、バインドを繰り返す必要がない場合があります。そうでない場合は、バインドを取得してメインクエリで使用するサブクエリまたはCTEを使用できます。次のようなもの:

    WITH CTE AS (
      SELECT :1 AS val_1, :2 AS val_2, :3 AS val_3, :4 AS val_4, :5 AS val_5
      FROM DUAL
    )
    SELECT MT.*
    FROM CTE
    JOIN MYTABLE MT
      ON ((MT.A is null and CTE.val_1 is null) or MT.A = CTE.val_1) 
     AND ((MT.B is null and CTE.val_2 is null) or MT.B = CTE.val_2) 
     AND ((MT.C is null and CTE.val_3 is null) or MT.C = CTE.val_3) 
     AND ((MT.D is null and CTE.val_4 is null) or MT.D = CTE.val_4) 
     AND ((MT.E is null and CTE.val_5 is null) or MT.E = CTE.val_5) 
    

    魔法の値がゼロの列を実際に持つことができない限り、ゴードンの関数ベースのインデックスアプローチは、より信頼性が高く、理解しやすいかもしれません。 (私もあなたの質問でその行を見逃し、あなたがすでにそれを割り引いていることに気づいていませんでした!)




    1. 式付きの文字列を10進数に変換します

    2. MySqlサーバーからAndroidアプリに移動するにはどうすればよいですか?

    3. PHPを使用して画像をフォルダにアップロードし、説明をデータベースに保存します

    4. 開始日と終了日の間の値を選択します