SQL CASE Statement–Simple and Searched Forms
SQL CASE式の主な目的は、一つ以上の条件付きテストに基づいて値を返します。 Sql文式の任意の場所で使用することができます。 本当に表現ですが、一部の人々はそれらを”CASE文”と呼んでいます。”これは、プログラミング言語での使用に起因する可能性が最も高いです。
SQL CASE式は非常に汎用性が高く、SQLServerクエリ全体で使用されます。 特に、SELECT列リスト、GROUP BY、HAVING、およびORDER BY句で使用されます。 CASE式は、データを標準化(美化)したり、ゼロ除算などのエラーから保護するためのチェックを実行したりします。
このレッスンのすべての例は、Microsoft SQL Server Management StudioおよびAdventureworks2012データベースに基づいています。 私の無料ガイドと無料のMicrosoftツールを使用してSQL Serverの使用を開始します。
SQL Server CASEステートメント
CASE句には、simpleとsearchの2つの形式があります。 両方のフォームは、式のテストに基づいて結果を返します。 技術的には表現ですが、多くの人がそれを声明として参照しているのを見るでしょう。
単純なSQL CASE文は、等価性テストに使用されます。 これは、複数の値に対して一つの式をテストし、これは、そのような対応する長い形式に略語として、値の一つのセットを変換するためにそれが素晴ら
検索されたSQL CASE文では、より包括的な式評価形式が使用されます。 給与の範囲や年齢など、データの範囲で作業したい場合に適しています。
まず単純な形式から始め、次に検索をカバーします。
CASE expression Simple Form
CASE式の単純な形式は、式の結果を一連のテストと比較し、”test”がtrueを返すときに”result”を返します。
単純なフォームCASE式の一般的な形式は次のとおりです。
CASE expression
WHEN test THEN result
…
ELSE otherResult
END
ELSEステートメントはCASE式ではオプションです。 一致が行われず、ELSEが存在する場合は、”otherResult”を返します。 CASE文にELSEがない場合は、NULLを返します。ELSE句は、不正なデータ値や予期しないデータ値をキャッチし、NULL以外の結果を返すのに最適な方法です。
データ変換の例
CASEステートメントを使用するには、いくつかの理由があります。 最初は、ある値のセットから別の値のセットにデータを変換することです。 たとえば、従業員の性別を”男性”または”女性”として表示するには、データが”M”または”F”としてエンコードされている場合、CASE式を使用して単一の文字表現をテス
この例は次のようになります。
:
SELECT JobTitle,
CASE Gender
WHEN 'M' THEN 'Male'
WHEN 'F' THEN 'Female'
ELSE 'Unknown Value'
END
FROM HumanResources.Employee
データ標準化の例
同様に、単純なCASE句を使用して複数の値を一つに標準化することができます。 この例を拡張すると、いくつかのバリエーションが男性または女性のいずれかにマップされます。
データベース内に別のテーブルを作成し、それを使用して値を検索できるかどうか疑問に思うかもしれません。 私はそれが最善であることに同意する傾向がありますが、多くの状況では、データベースにテーブルを作成する権限がありません。 この場合、SELECT文が提供する知恵に任されます。
Summary
単純なCASE式を使用するときに考慮すべきことがいくつかあります。
- は等価比較のみを許可します。
- 評価テストは定義された順序で評価されます。
- 最初の真のテストに対応する結果を返します。
- 一致が行われない場合、ELSEが存在しない限り、caseはNULLを返します。
CASE式の検索フォーム
CASE式の検索フォームは、より汎用性の高いテストを可能にします。 これを使用して、より広い範囲のテストを評価します。 実際には、任意のブール式はテストとしての資格があります。
CASE式から検索された式は次の形式になります
CASE
WHEN booleanExpression THEN result
…
ELSE otherResult
END
検索された形式では、When句を使用してブール式を評価します。 最初の真のブール式の結果が返されます。
以下は、前のセクションの従業員の性別の例の検索されたケース形式です。
この同じ例を単純なSQL case文にも使用しました。 あなたが微妙な違いを見ることができるように私はこれをしました。 各WHEN句には、ブール式としてテストが含まれていることに注意してください。
単純なフォームと検索されたフォームのSQLケースの比較
ここでは、ステートメントを並べています。




ブール式をテストしているので、検索されたCASE文は単なる等価テストに限定されません。 これにより、この形式は値の範囲を比較するのに非常に適しています。 おそらく、Adventure Worksのセールスマネージャーは、価格帯別に製品を整理したいと考えています。 これはSQLでどのように行うことができますか?
セールスマネージャーが提供する次の名前と範囲を指定すると、CASE式を構築してListPriceを値の範囲と比較し、適切な価格範囲名を返すことができます。

caseステートメントは選択列リストに配置され、文字値を返します。 トリックを行うSQLは次のとおりです:
このクエリを実行すると、PRICERANGEがリストされ、CASE式で指定された範囲に従って値が表示されます。

CASE文エラー。 良い例は、数値を除算するときなど、式内で有効な値をテストすることです。
考慮してください
SELECT ProductID,
Name,
ProductNumber,
StandardCost,
ListPrice,
StandardCost / ListPrice as CostOfGoodSold
FROM Production.Product
このステートメントは、メッセージを返します
Divide by zero error encountered.
CASE句を使用することにより、誤ってゼロで除算しない
SELECT ProductID, Name, ProductNumber, StandardCost, ListPrice, CASE WHEN ListPrice = 0 Then NULL ELSE StandardCost / ListPrice END as CostOfGoodSoldFROM Production.Product
CASE式は、式を使用できる場所であればどこでも使用できます。 つまり、これを使用して列値の結果を返すことも、ORDER BY句で使用することもできます。
次のセクションでは、ORDER BY句とGROUP BY句でのケースの使用方法について説明します。
CASE式IN ORDER BY
セールスマネージャーの要求を続けて、価格帯でソートされた製品を表示し、次に製品名を表示したいとします。 価格帯を列として表示する方法を見てきましたが、どのように並べ替えるのですか?実際にはかなり簡単です。
CASEは式なので、結果を順番に並べ替える値の一度として使用することができます。 テーブルの列のソートだけに限定されるものではなく、式をソートすることもできます。
ここでは、価格帯で並べ替えるためのクエリです。
私たちは、また、価格帯を表示するには、リストを選択するケース文を追加することができます。あなたが見ることができるように、物事は複雑になり始めます。
あなたが見ることができるように、物事は複雑に SELECTリストとORDER BYの両方でCASE文がどのように繰り返されるかがわかりますか? 幸いなことに、これを少し単純化することはできますが、ORDER BYからCASEステートメントを削除し、SELECT list CASE式のエイリアス名PriceRangeに置き換えることができます。
CASE式IN GROUP BY
セールスマネージャーに要約データを表示したい詳細なリストを与えたので、これで終わりませんか? 私の経験ではそうではないので、顧客の要求を満足させるために多くのSQLを知ることが成功への鍵です。とにかく、良いニュースは、要約グループを作成するために構築したCASE式を使用できることです。 次のSQLでは、PriceRangeでデータをグループ化しています。 ListPriceの最小値、最大値、および平均値に関する要約統計が作成されます。ORDER BY句とは異なり、GROUP BYの列エイリアスPriceRangeを参照することはできません。 CASE式全体を繰り返す必要があります。 クエリの結果は次のとおりです:

ラップアップ
ご覧のように、CASE式を使用すると、SQL文に汎用性が追加されます。 これらは、ある値のセットから別の値にデータを変換できるだけでなく、ステートメントがエラーを返さないようにするためにも使用できます。シンプルで検索された2つのフォームのうち、私は検索フォームを使用する傾向があります。
その理由は、単純な形式は等価テストに限定されているからです。CASE式は式であり、文や句ではないため、他の式が使用されている場所で使用できます。 これは、SELECT文全体やSQLの他の場所で使用できることを意味します。
Leave a Reply