サーチ…


前書き

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ありません。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow