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

CASEおよびCOALESCEの短絡評価は、PL / SQLのシーケンスでは機能しますが、SQLでは機能しません。

    PL / SQLの場合、Oracleは短絡評価を使用することを保証します。

    差出人: 2 PL/SQL言語の基礎>

    nextvalを使用する場合 SQLコードでは、状況が異なります。

    まず、currval およびnextval 疑似列です:

    差出人:3つの疑似列

    ここでの問題は、Oracleがnextvalを評価する理由です。 ?またはこの動作はどこかに記載されていますか?

    差出人:シーケンス疑似列

    あなたのケースは明らかに「1.トップレベルのSELECTステートメント」ですが、それは短絡ロジックが配置されていないことを意味するのではなく、そのnextvalだけを意味します。 常に評価されます。

    短絡ロジックに関心がある場合は、nextvalを削除することをお勧めします。 方程式から。

    このようなクエリはサブクエリを評価しません:

    select 6 c
      from dual
    where  'a' = 'a' or 'a' = (select dummy from dual) 
    

    しかし、coalesceで同様のことをしようとすると またはcase OracleOptimizerがサブクエリの実行を決定することがわかります。

    select 6 c
      from dual
    where  'a' = coalesce('a', (select dummy from dual) )
    

    SQLFiddleのこのデモ で注釈付きテストを作成しました これを表示します。

    Oracleは、OR条件がある場合にのみ短絡ロジックを適用しているように見えますが、coalesce およびcase すべてのブランチを評価する必要があります。

    PL / SQLでの最初のテストでは、coalsce およびcase Oracleが述べているように、PL/SQLで短絡ロジックを使用します。 SQLステートメントのシーケンスを含む2番目のテストでは、その場合はnextval 結果が使用されない場合でも、とにかく評価され、Oracleもそれを文書化します。

    coalesceであるため、2つのことを組み合わせると少し奇妙に見えます。 およびcase 私も動作に一貫性がないようですが、そのロジックの実装は実装に依存することにも留意する必要があります(ここに私のソース



    1. PythonはMySQLテーブルをSQLite3にコピーします

    2. Oracle PL / SQL-NO_DATA_FOUND例外はストアドプロシージャのパフォーマンスに悪影響を及ぼしますか?

    3. 1つのクエリで複数のテーブル、サイズ、およびテーブルスペースをカウント(*)する方法

    4. 更新の前後でフィールドがすべて等しい場合、postgresは実際にページファイルを更新しますか?