39. 8-6. is NULL, is not NULL
•Is NULL, is not NULLに空文字も該当させたい場合は空文字に対
する条件を追加する。
変換方法
制約
•CASE文を項目に対して適用することも出来るが、is NULLの場合、該当項
目がindex項目やkey項目の場合に値検索ではなくscan検索となりパフォー
マンスが悪くなるケースもありうるコメント
変換例(is NULL):
変換前:WHERE COL1 is NULL
変換後:WHERE (COL1 is NULL or COL1 = '')
またはWHERE (COL1 is NULL or char_length(COL1) = 0)
変換例(is not NULL):
変換前:WHERE COL1 is not NULL
変換後:WHERE (COL1 is not NULL and COL1 <> '')
またはWHERE (COL1 is not NULL and char_length(COL1) <> 0)
41. 8-8. ORDER BY
•ORDER BYにおいて空文字とNULLを分けない場合はCASEを入
れる
変換方法
制約
• SQL/MXでは文字列項目においては空文字が一番小さなものとして評価
される。NULLは一番大きなものとして評価される
•Oracleでは空文字とNULLはNULLとして評価
コメント
変換例:
変換前:SELECT COL1 from TBL1 ORDER BY COL1
変換後:SELECT (CASE WHEN COL1 = '' THEN NULL ELSE COL1 END) ORD_COL
ORDER BY ORD_COL
またはSELECT (CASE WHEN char_length(COL1) = 0 THEN NULL ELSE COL1 END) ORD_COL
ORDER BY ORD_COL
42. 8-9. GROUP BY#1
•GROUP BYにおいて空文字とNULLを分けない場合はCASEを入
れる
変換方法
制約
• SQL/MXでは文字列項目においては空文字とNULLは別のグループとな
る
•Oracleは空文字とNULLは等価なため1つのグループとなる
コメント
変換例:
変換前:SELECT COL1 from TBL1 GROUP BY COL1
変換後:SELECT (CASE WHEN COL1 = '' THEN NULL ELSE COL1 END) GRP_COL
GROUP BY GRP_COL
またはSELECT (CASE WHEN char_length(COL1) = 0 THEN NULL ELSE COL1 END) GRP_COL
GROUP BY GRP_COL
43. 8-9. GROUP BY#2
•CASE文を入れたGROUP BY項目の別名を項目名と同一にした
場合はGROUP BY後の別名ではなく項目名でGROUP BYされる
ため、表示名を変えたくない場合は一旦別名を項目名と違う名称に
し、サブクエリ化して再度名称を戻す形とするか、GROUP BY指定
にCASE文をそのまま記載する
注意
事項
NG例:
SELECT
(CASE WHEN COL1 = '' THEN NULL ELSE COL1 END) COL1
GROUP BY COL1
※例は空文字比較のケースのみ記載(char_length() = 0もあり)
OK例1:
SELECT COL1_GRP as COL1
FROM
(SELECT
(CASE WHEN COL1 = '' THEN NULL ELSE COL1 END) COL1_GRP
GROUP BY COL1_GRP
) sub1
OK例2:
SELECT
(CASE WHEN COL1 = '' THEN NULL ELSE COL1 END) COL1
GROUP BY (CASE WHEN COL1 = '' THEN NULL ELSE COL1 END)