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