ページの先頭行へ戻る
Symfoware Server V12.7.0 アプリケーション開発ガイド(共通編)
FUJITSU Software

9.7 CASE式を使用してデータを操作する

CASE式は、列やホスト変数などの値に応じて結果列の値の変更、取り出す列の優先付けをすることができます。また、場合分けをして、それぞれに対応した値に設定することもできます。

CASE式の使用例を以下に示します。

例1

履歴表から、利用者ごとに利用したサービスの回数を求めます。

SELECT 利用者,COUNT(CASE WHEN サービス    = 1
THEN サービス ELSE NULL END) AS サービス1
COUNT(CASE WHEN サービス = 2
THEN サービス ELSE NULL END) AS サービス2
COUNT(CASE WHEN サービス = 3
THEN サービス ELSE NULL END) AS サービス3 FROM 履歴表 GROUP BY 利用者


例2

ポイント表から、ポイントに応じて記号(PLATINUM、GOLDまたはSILVER)を付加した利用者と合計ポイントを求めます。

SELECT 利用者,合計ポイント, 
  CASE WHEN 合計ポイント >= 50000 THEN 'PLATINUM'
WHEN 合計ポイント >= 10000 THEN 'GOLD'
WHEN 合計ポイント >= 3000 THEN 'SILVER'
ELSE NULL END AS ランク FROM ポイント表


例3

利用者表から、メールアドレス、TEL番号、住所の優先順で最初の設定のある項目を求めます。

SELECT 利用者,CASE WHEN メール IS NOT NULL THEN メール
                   WHEN TEL    IS NOT NULL THEN TEL
                   ELSE                         住所 END AS 連絡先
  FROM 利用者表


例4

ポイント表から、次のランクのポイントにあと500ポイントで到達する利用者と合計ポイントを求めます。それぞれのランクは、SILVERが3000ポイント、GOLDが10000ポイント、PLATINUMが50000ポイントとします。

SELECT 利用者,合計ポイント FROM  ポイント表
  WHERE 合計ポイント >= CASE WHEN 合計ポイント <= 3000 THEN 2500
WHEN 合計ポイント <=10000 THEN 9500
WHEN 合計ポイント <=50000 THEN 49500 END


例5

履歴表から、利用したサービスをグループ化してグループごとの総利用回数を求めます。

SELECT サービスグループ, COUNT(*)  AS 総利用回数
FROM 履歴表
GROUP BY   CASE WHEN サービス    IN (1,4,7) THEN 'サービスグループ1'
WHEN サービス IN (2,5,8) THEN 'サービスグループ2'
ELSE 'サービスグループ3' END AS サービスグループ


例6

履歴表に記述されたサービス記号を変更します。

UPDATE 履歴表
  SET サービス =   CASE WHEN サービス  =  1  THEN  111
                        WHEN サービス  =  2  THEN  222
                        WHEN サービス  =  3  THEN  333
                        ELSE 999                       END


例7

履歴表にデータを1行追加します。履歴番号はホスト変数“:RIREKI_NO”の値、利用者はホスト変数“RIYOUSYA”の値、サービスはホスト変数“SERVICE”に対応するコードを割り振るCASE式の結果の値とします。ここでは、ホスト変数“RIREKI_NO”には“6”、“RIYOUSYA”には“USER-C”、“SERVICE”には“宿泊”が設定されているとします。CASE式により、“SERVICE”の値である“宿泊”は4に変換してから履歴表に追加します。

INSERT INTO 履歴表(履歴番号,利用者,サービス)
  VALUES(:RIREKI_NO,:RIYOUSYA,
           CASE WHEN :SERVICE = N'飲食' THEN 1
                   WHEN :SERVICE = N'ショッピング' THEN 2
WHEN :SERVICE = N'公共料金' THEN 3
WHEN :SERVICE = N'宿泊' THEN 4
WHEN :SERVICE = N'交通' THEN 5
WHEN :SERVICE = N'給油' THEN 6
WHEN :SERVICE = N'通販' THEN 7
WHEN :SERVICE = N'移行' THEN 8
ELSE 9 END)