サーチ…
前書き
CASE式は、if-thenロジックを実装するために使用されます。
構文
- CASE input_expression
WHEN compare1 THEN result1
[WHEN compare2 THEN result2] ...
[ELSE resultX]
終わり - 場合
WHEN条件1 THEN結果1
[WHEN condition2 THEN result2] ...
[ELSE resultX]
終わり
備考
単純CASE式は、その最初の結果を返しcompareX
値に等しいinput_expression
。
検索されたCASE式は、 conditionX
が真である最初の結果を返します。
SELECTでCASEを検索する(ブール式に一致)
ブール式がTRUEの場合、 検索された CASEは結果を返します。
(これは、入力との等価性のみをチェックできる単純なケースとは異なります)。
SELECT Id, ItemId, Price,
CASE WHEN Price < 10 THEN 'CHEAP'
WHEN Price < 20 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END AS PriceRating
FROM ItemSales
イド | ItemId | 価格 | PriceRating |
---|---|---|---|
1 | 100 | 34.5 | 高価な |
2 | 145 | 2.3 | 安いです |
3 | 100 | 34.5 | 高価な |
4 | 100 | 34.5 | 高価な |
5 | 145 | 10 | 合理的 |
条件に一致する列の行数をCASEからCOUNTまで使用します。
使用事例
CASE
は、 SUM
と組み合わせて使用して、事前定義された条件に一致する項目のみのカウントを戻すことができます。 (ExcelのCOUNTIF
に似ています)。
このトリックは、一致を示すバイナリ結果を返すことで、一致するエントリに対して返される "1"は、一致の合計数の合計に対して合計されることができます。
この表ItemSales
与えられた場合、「高価」として分類されたアイテムの総数を知りたいとしましょう。
イド | ItemId | 価格 | PriceRating |
---|---|---|---|
1 | 100 | 34.5 | 高価な |
2 | 145 | 2.3 | 安いです |
3 | 100 | 34.5 | 高価な |
4 | 100 | 34.5 | 高価な |
5 | 145 | 10 | 合理的 |
クエリ
SELECT
COUNT(Id) AS ItemsCount,
SUM ( CASE
WHEN PriceRating = 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
結果:
ItemsCount | ExpensiveItemsCount |
---|---|
5 | 3 |
代替:
SELECT
COUNT(Id) as ItemsCount,
SUM (
CASE PriceRating
WHEN 'Expensive' THEN 1
ELSE 0
END
) AS ExpensiveItemsCount
FROM ItemSales
SELECTの略語
CASE
の短縮形は、一連の値に対して式(通常は列)を評価します。この変種は少し短く、評価された表現を何度も何度も繰り返して保存します。ただし、 ELSE
節は引き続き使用できます。
SELECT Id, ItemId, Price,
CASE Price WHEN 5 THEN 'CHEAP'
WHEN 15 THEN 'AFFORDABLE'
ELSE 'EXPENSIVE'
END as PriceRating
FROM ItemSales
注意の言葉。ショートバリアントを使用する場合、 WHEN
ごとに文全体が評価されることを理解することが重要です。したがって、次のステートメント
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'Dr'
WHEN 1 THEN 'Master'
WHEN 2 THEN 'Mr'
WHEN 3 THEN 'Mrs'
END
NULL
結果を生成する可能性がありNULL
。なぜなら、 NEWID()
が新しい結果で再び呼び出されている各WHEN
です。に相当:
SELECT
CASE
WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
END
したがって、 WHEN
すべてのケースがWHEN
、結果がNULL
。
ORDER BY句のCASE
1,2,3 ..を使って注文のタイプを決めることができます:
SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
WHEN 'MARKETING' THEN 1
WHEN 'SALES' THEN 2
WHEN 'RESEARCH' THEN 3
WHEN 'INNOVATION' THEN 4
ELSE 5
END,
CITY
ID | 領域 | シティ | 部門 | EMPLOYEES_NUMBER |
---|---|---|---|---|
12 | ニューイングランド | ボストン | マーケティング | 9 |
15 | 西 | サンフランシスコ | マーケティング | 12 |
9 | 中西部 | シカゴ | 販売 | 8 |
14 | 大西洋中部 | ニューヨーク | 販売 | 12 |
5 | 西 | ロサンゼルス | 研究 | 11 |
10 | 大西洋中部 | フィラデルフィア | 研究 | 13 |
4 | 中西部 | シカゴ | 革新 | 11 |
2 | 中西部 | デトロイト | 人事 | 9 |
UPDATEでのCASEの使用
価格上昇のサンプル:
UPDATE ItemPrice
SET Price = Price *
CASE ItemId
WHEN 1 THEN 1.05
WHEN 2 THEN 1.10
WHEN 3 THEN 1.15
ELSE 1.00
END
最後に順序付けられたNULL値のCASE使用
このようにして、既知の値を表す '0'が最初にランク付けされ、NULL値を表す '1'が最後にソートされます。
SELECT ID
,REGION
,CITY
,DEPARTMENT
,EMPLOYEES_NUMBER
FROM DEPT
ORDER BY
CASE WHEN REGION IS NULL THEN 1
ELSE 0
END,
REGION
ID | 領域 | シティ | 部門 | EMPLOYEES_NUMBER |
---|---|---|---|---|
10 | 大西洋中部 | フィラデルフィア | 研究 | 13 |
14 | 大西洋中部 | ニューヨーク | 販売 | 12 |
9 | 中西部 | シカゴ | 販売 | 8 |
12 | ニューイングランド | ボストン | マーケティング | 9 |
5 | 西 | ロサンゼルス | 研究 | 11 |
15 | ヌル | サンフランシスコ | マーケティング | 12 |
4 | ヌル | シカゴ | 革新 | 11 |
2 | ヌル | デトロイト | 人事 | 9 |
ORDER BY句のCASEを使用して、2列の最小値でレコードをソートします。
2つの列のいずれかの最小値でソート・レコードが必要であるとします。一部のデータベースでは、集計されていないMIN()
またはLEAST()
関数をこの( ... ORDER BY MIN(Date1, Date2)
)で使用できますが、標準SQLではCASE
式を使用する必要があります。
以下のクエリのCASE
式は、 Date1
列とDate2
列を調べ、どの列の値が小さいかを調べ、この値に応じてレコードをソートします。
サンプルデータ
イド | Date1 | Date2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
2 | 2017-01-31 | 2017-01-03 |
3 | 2017-01-31 | 2017-01-02 |
4 | 2017-01-06 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
6 | 2017-01-04 | 2017-01-31 |
クエリ
SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE
WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1
ELSE Date2
END
結果
イド | Date1 | Date2 |
---|---|---|
1 | 2017-01-01 | 2017-01-31 |
3 | 2017-01-31 | 2017-01-02 |
2 | 2017-01-31 | 2017-01-03 |
6 | 2017-01-04 | 2017-01-31 |
5 | 2017-01-31 | 2017-01-05 |
4 | 2017-01-06 | 2017-01-31 |
説明
2017-01-01
Id = 1
行が最初であることがわかります。これは、 Date1
がテーブル2017-01-01
全体から最低レコードを持つため、 2017-01-01
Id = 3
行は、 Date2
がテーブルの2番目に小さい2017-01-02
等々。
したがって、 2017-01-01
から2017-01-01
までのレコードを2017-01-01
に並べ替え、 Date1
またはDate2
どちらの列がこれらの値であるかを気にする2017-01-06
ありません。