問題:
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 WHENTHEN , 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'
に結果が割り当てられていない カテゴリ。