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

ヒントと例で説明されたOracleCaseステートメント

    前回の投稿でOracleDecode処理の動作を確認しました

    OracleSQLデコード処理

    次に、OracleCaseステートメントの処理を見てみましょう

    OracleのCaseステートメント

    これは、Decodeステートメントに似ています。 Oracle 8.1.6より前のデータベースには、DECODE関数しかありませんでした。 CASEは、Oracle 8.1.6で、標準の、より意味のある、より強力な関数として導入されました。

    DECODEでできることはすべて、CASEでもできます。 CASEでできることは他にもたくさんありますが、DECODEではできません。この記事では詳細な例を見ていきます

    Caseステートメントの構文から始めましょう

    CASE [expression]
    
    when condition_1 then value_1
    when condition_2 then value_2
    when condition_2 then value_2
    ….
    
    else value_n
    end
    

    式はオプションです

    CaseステートメントはSimpleCaseステートメントとSearchablecaseステートメントの2つのカテゴリに分けることができます

    単純なcaseステートメントはDecode関数と同じです。

    単純なCASEステートメントの例

    select
    case
    region
    when ‘N’ then ’North’
    when ‘S’ then ’South’
    when ‘E’ then ’East’,
    when ‘W’ then ’West’
    else ‘UNKNOWN’
    end
    from
    customer;
    

    検索可能なCaseステートメントは、条件または述語を指定するcaseステートメントです(複数の条件を持つOracleのcaseステートメント)

    SQL> select emp_name
    , case
    when Salary < 10000
    then 'Junior Level'
    when (Salary >=10000 and Salary < 50000)
    then 'Middle Level'
    when (Salary >= 50000 and Salary < 100000)
    then 'Senior Level'
    else 'Managers'
    end Emp_level
    from employee_info
    where rownum < 5;
    
    EMP_NAME EMP_LEVEL
    ---------- ---------
    JOHN Junior Level
    DON Senior Level
    BOB Manager
    BILL Middle Level
    
    ネストされたOracleCaseステートメント

    これはcaseステートメント内のcaseステートメントです

    SQL> select emp_name
    , case
    when Salary < 10000
    then 'Junior Level'
    when (Salary >=10000 and Salary < 50000)
    then 'Middle Level'
    when (Salary >= 50000 and Salary < 100000)
    then 'Senior Level'
    else  (Case when grade ='20'  then 'Vice President'
    when grade='21'  then 'Senior Vice President'
    else 'Manager'
    End)
    end Emp_level
    from employee_info
    where rownum < 5;
    
    シンプルで検索可能なCaseステートメントに関する重要なポイント

    (1)検索されたCASEは、各「when」オプションの下で条件を個別に評価します。この構造を使用すると、単純なCASEよりもはるかに複雑な条件を検索されたCASEで実装できます。

    (2)検索されたCASEは、複数の列、比較、およびAND/OR演算子を使用して複数のテストを組み合わせることができます。

    (3)単純なCASE構造と検索されたCASE構造の両方で、条件は上から下に順番に評価され、最初の一致が見つかった後に実行が終了します。したがって、複数の条件が真であるとすると、最初のアクションのみが考慮されます。

    (4)Oracle Databaseは、短絡評価を使用します。つまり、単純なCASE式の場合、データベースは、exprと比較する前にすべてのcomparation_expr値を評価するのではなく、exprと比較する前にのみ各comparation_expr値を評価します。したがって、前のcomparation_exprがexprと等しい場合、Oracleはcomparation_exprを評価しません。検索されたCASE式の場合、データベースは各条件を評価してそれが真であるかどうかを判断し、前の条件が真であった場合は条件を評価しません

    次に、CaseステートメントとDecodeステートメントの違いを見てみましょう

    (1)DECODEはスカラー値のみを処理できますが、CASEは論理演算子、述語、および検索可能なサブクエリを処理できます。

    デコードはスカラー値で機能することがわかっています。論理演算子には使用できません。それを利用するには、スカラー値に変換する必要があります。

    ケースを使用すると、プロセス全体が簡単になります。 Caseステートメントで論理演算子を簡単に使用できます

    SQL> select city
    , case
    when population < 100000
    then 'Tier I'
    when (population >=100000 and population < 200000)
    then 'Tier II'
    when (population >= 200000 and population < 300000)
    then 'Tier III'
    else 'TIER IV'
    end City_Tier
    from city_info
    where rownum < 5;
    
    CITY CITY_TIER
    ---------- ---------
    XYX TIER I
    XYZ TIER II
    XZW TIER II
    
    

    上記は検索可能なケースステートメントと呼ばれます

    (2)CASEはPL / SQL構造として機能できますが、DECODEはSQL文でのみ使用されます。CASEは関数/プロシージャのパラメータとして使用できます。

    DECLARE
    
    V_x VARCHAR2(10) := 'A';
    V_y VARCHAR2(10);
    
    BEGIN
    
    V_y := CASE V_x
    WHEN 'A' THEN 'Excellent'
    WHEN 'B' THEN 'Good'
    WHEN 'C' Then 'Average'
    ELSE 'Poor'
    END;
    
    DBMS_OUTPUT.PUT_LINE(
    'Grade V_x is '||V_y||'.'
    );
    
    END;
    /
    

    グレードV_xは優れています。

    (3)CASEはデータ型の一貫性を期待しますが、DECODEは期待しません。

    select case 5 when 1 then '1'
    2 when '2' then '2'
    3 else '5'
    4 end
    5 from dual;
    when '2' then '2'
    *
    ERROR at line 2:
    ORA-00932: inconsistent datatypes: expected NUMBER got CHAR
    

    (4)CASEはANSISQLに準拠しています。 DECODEはOracle独自のものです。

    (5)CASEは、オプティマイザーでDECODEよりも高速に実行されます。

    (6)CASEはステートメントであり、DECODEは関数です。

    関連記事
    Oracle sql Tutorials:sqlを習得し、RDBMS(Oracle、MySql)データの管理と操作で使用できるすべてのsqlチュートリアルレッスンのリスト
    Oracleインタビューの質問:このページでトップ49を確認してくださいOracle Interviewの質問と回答:基本、インタビューに役立つOracleSQL。
    oraclePLSQLレコード:oraclePLSQLレコードの動作に関するこの記事を確認してください。また、それを定義して値を割り当てるさまざまな方法を見つけてください。
    Oracle SQL開発者ツール:Oracle sql開発者ツール、Oracle sql開発者のダウンロード方法、インストール方法に関するすべての情報については、このページを確認してください。
    oracle日付関数:この投稿で、oracle日付関数、年単位のoracle日付の違い、日単位のoracle日付の違い、月単位のoracle日付の違いを確認してください。
    https://docs.oracle.com/cd /B19306_01/server.102/b14200/expressions004.htm

    推奨コース

    OracleSQLの優れたUdemyコースは次のとおりです。
    Oracle-Sql-ステップバイステップ:このコースでは、基本的なSQL、結合、テーブルの作成とその構造の変更、ビューの作成、ユニオン、ユニオンなどすべてについて説明します。 。 SQL初心者のための素晴らしいコースと必須のコース
    完全なOracleSQL認定コース :これは、SQL開発者のスキルに対応できるようになりたい人にとっては良いコースです。わかりやすい説明コース
    OracleSQLDeveloper:Essentials、Tips and Tricks :OracleSql開発者ツールは多くの開発者によって使用されています。このコースでは、それを効果的に使用して生産的なSQL開発者になるための秘訣とレッスンを提供します。
    Oracle SQL Performance Tuning Masterclass 2020 :パフォーマンスの調整は、重要で最も求められているスキルの1つです。これは、それについて学び、SQLパフォーマンスの調整を開始するための良いコースです


    1. OracleSQLピボットクエリ

    2. 接続文字列からデフォルトのスキーマを設定できますか?

    3. Many2manyフィールドへの入力(odoo 8)

    4. Oracle 11gは、一致するすべてのオカレンスを正規表現で取得します