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

SQLでCASEステートメントを作成する方法

    問題:

    SQLでCASEステートメントを使用したい。

    例:

    exam テーブル。各結果を次のテキスト値のいずれかに割り当てる必要があります:'bad result''average result' 、または'good result' 。悪い結果は40未満の結果、良い結果は70を超える結果、残りは平均的な結果です。

    exam テーブルは次のようになります:

    name 結果
    Toby Shaw 56
    ケイシーワトソン 49
    ベニーリン 23
    レーンスローン 70
    ステフフォックス 85
    レジーワード 40
    ゲイルケネディ 66
    ブライスミューラー 90

    ソリューション1:

    SELECT
      name,
      result,
      CASE
        WHEN result < 40 THEN 'bad result'
        WHEN result > 70 THEN 'good result'
        ELSE 'average result'
      END AS category
    FROM exam;
    

    結果テーブルは次のようになります:

    name 結果 カテゴリ
    Toby Shaw 56 平均結果
    ケイシーワトソン 49 平均結果
    ベニーリン 23 悪い結果
    レーンスローン 70 平均結果
    ステフフォックス 85 良い結果
    レジーワード 40 平均結果
    ゲイルケネディ 66 平均結果
    ブライスミューラー 90 良い結果

    ディスカッション:

    特定の条件に基づいて値を表示するには、CASEを作成する必要があります 声明。構文は次のとおりです。

    CASE
      WHEN  THEN ,
      WHEN  THEN ,
      …
      ELSE 
    END AS 
    

    condition_1の場合 が満たされると、取得される値はvalue_1になります。 。そうでない場合、データベースはcondition_2をチェックします 。 condition_2の場合 trueの場合、取得される値はvalue_2です。 。これらの条件のいずれも満たされない場合、SQLは、条件の1つが満たされるまで、残りの条件を1つずつ順番にチェックします。いずれの条件も満たされない場合、value_n ELSEの後に指定 取得されます。

    ELSE 一部はオプションです。これを省略し、いずれの条件も満たされない場合は、NULLを取得します。 。

    ENDを忘れないでください CASE すべての条件が完了したら、句を使用します。もちろん、作成する他の列と同様に、名前を変更できます(AS <column_name>

    この例では、'bad result' result < 40, and 'good result'の場合に割り当てられます result > 70のときに割り当てられます 。これらの条件のいずれも満たされない場合、値は'average result'です。 。また、新しく作成されたテキスト値の列に名前を付けるには、エイリアス(AS)を使用する必要があります。 カテゴリー)。これがあなたが得る方法です:

      CASE
        WHEN result < 40 THEN 'bad result'
        WHEN result > 70 THEN 'good result'
        ELSE 'average result'
      END AS category
    

    'average result'以降 40の間の結果に割り当てられます および70 (包括的)、ELSEの代わりに条件を書くこともできます (以下の解決策2を参照してください)。ただし、ELSEを使用する方が簡単です。 。

    ソリューション2:

    SELECT
      name,
      result,
      CASE
        WHEN result < 40 THEN 'bad result'
        WHEN result > 70 THEN 'good result'
        WHEN result >= 40 AND result <= 70 THEN 'average result'
      END AS category
    FROM exam;
    
    >

    結果テーブルは次のようになります:

    name 結果 カテゴリ
    Toby Shaw 56 平均結果
    ケイシーワトソン 49 平均結果
    ベニーリン 23 悪い結果
    レーンスローン 70 平均結果
    ステフフォックス 85 良い結果
    レジーワード 40 平均結果
    ゲイルケネディ 66 平均結果
    ブライスミューラー 90 良い結果

    ディスカッション:

    'average result'以降 40の間の結果に割り当てられます および70 (包括的)、ELSEの代わりに次の条件を書くことができます :

    WHEN result >= 40 AND result <= 70 THEN 'average result'

    ELSEを使用しない場合 NULLは必要ありません scategory 列、あなたはあなたがすべての可能なresultの世話をすることを確認する必要があります 値。 resultがある場合 いずれの条件も満たさない場合は、NULLを取得します 。

    ソリューション3:

    SELECT
      name,
      result,
      CASE
        WHEN result < 40 THEN 'bad result'
        WHEN result <= 70 THEN 'average result'
        ELSE 'good result'
      END AS category
    FROM exam;
    

    結果テーブルは次のようになります:

    name 結果 カテゴリ
    Toby Shaw 56 平均結果
    ケイシーワトソン 49 平均結果
    ベニーリン 23 悪い結果
    レーンスローン 70 平均結果
    ステフフォックス 85 良い結果
    レジーワード 40 平均結果
    ゲイルケネディ 66 平均結果
    ブライスミューラー 90 良い結果

    ディスカッション:

    CASEで指定された条件 前のソリューションのように重複しないようにすることも、このソリューションのように重複させることもできます。最初の条件は以前と同じです– result < 40の場合 、category 'bad result'40未満のすべての結果 この時点でこの値が割り当てられ、もう何もする必要はありません。これは、result >= 40を確認する必要がないことを意味します 'average result'の条件を指定する場合 – 40未満のすべての結果には、すでに値'bad result'があります。 割り当てられました。最後に、残りの結果のカテゴリは'good result'である必要があります;単純なELSE 'good result' それの世話をします。これがあなたが得る方法です:

    CASE
        WHEN result < 40 THEN 'bad result'
        WHEN result <= 70 THEN 'average result'
        ELSE 'good result'
    END AS category
    

    注:CASEの条件の順序 重要です。最初の2つの条件の順序を逆にした場合(つまり、WHEN result <= 70 THEN 'average result'を指定した場合 最初にWHEN result <= 70 THEN 'average result' 2番目)、すべての結果が70以下 最終的に'average result'になります カテゴリ、'bad result'に結果が割り当てられていない カテゴリ。


    1. 外部キー制約で使用される列を変更できません

    2. OracleDatabaseで有効なタイムゾーンのリストを返す方法

    3. SQLiteでチェック制約を作成する

    4. 認証プラグイン「caching_sha2_password」はサポートされていません