検索に検索に検索に検索を重ねて、やっと、やっと、やっと見つけたーっっ!!!!
【coalesce(引数1, 引数2, …)】
その値が NULL 値以外の最初の引数を戻す関数。
結果は、すべての引数が NULL 値の場合のみ NULL 値になる。
↑ 【coalesce(NULL, 'Sandy')】 なら 「Sandy」 を
【coalesce(NULL, NULL, 4)】 なら 「4」 を
指定した全引数が NULL 値だった場合のみ 「NULL 値」 を
結果セットとして戻す関数だぞ、と言っているのであるな。うむ。
つまり、だ!! この関数を利用して、NULL に変換をかけてしまえばいいってことじゃないか!!!! (嬉)
昨日の例で言うと、
1.A = 'Sandy' と
2.A = (null) を比較した時
【where 1.A <> 2.A】 で引っかからないんだから
【where coalesce(1.A,'') <> coalesce(2.A,'')】 で引っかけりゃいいのだ。
ということは、
1.A = 4 と
2.A = (null) を比較したいなら
【where 1.A <> 2.A】 の代わりに
【where int(coalesce(1.A,'0')) <> int(coalesce(2.A,'0'))】 だ。
You understand?? つまり、
| 表記 | A is null の結果 |
A = 'Sandy' の結果 |
A = '4' の結果 |
| coalesce(A, '') | '' | 'Sandy' | '4' |
| coalesce(A, '0000') | '0000' | 'Sandy' | '4' |
| int(coalesce(A, '0000')) | 0 | <数値変換不可> | 4 |
だからなんだわさ。
関数 「coalesce」 Bravo!! 気付いたみさちゃん。も、Bravo!!!!
★ Oracle 開発者のための DB2 SQL リファレンス.pdf
⇒ http://www-1.ibm.com/support/docview.wss?uid=std3ab61aa44063a8fa0492570e3002bf8b0
(↑ 無料で DL しちゃっていいんですか?? ってなカンジだよ。 目次だけ印刷しとくと便利かも。)
★ IBM DB2 ユニバーサル・データベース 移植ガイド ~ Oracle から DB2 V7.2 ~
⇒ http://www-06.ibm.com/jp/software/data/developer/library/techdoc/pdf/oracletodb2v31.pdf
キーが 1 対 1 で一致する他テーブルのフィールド値を基に、値を更新する SQL (データ補正とか。) の一例。
| /*【補正対象データ確認】⇒ 更新値と被更新値の差異をチェック */ select 1.KEY, 2.A, 1.A, 1.UPD_DT from TABLE_1 1, TABLE_2 2 where 1.KEY = 2.KEY and coalesce(1.A,'') <> coalesce(2.A,'') order by 1.KEY ; /*【補正実行】*/ update TABLE_1 1 set A = (select A from TABLE_2 2 where 1.KEY = 2.KEY) ,B = (select B from TABLE_2 2 where 1.KEY = 2.KEY) ,UPD_DT = (select CURRENT TIMESTAMP from SYSIBM.SYSDUMMY1) where exists (select * from TABLE_2 2 where 1.KEY = 2.KEY and coalesce(1.A,'') <> coalesce(2.A,'')) ; /*【補正対象データ再確認】 ⇒ 「0行」 選択されることを確認 */ select 1.KEY, 2.A, 1.A, 1.UPD_DT from TABLE_1 1, TABLE_2 2 where 1.KEY = 2.KEY and coalesce(1.A,'') <> coalesce(2.A,'') order by 1.KEY ; /*【補正結果確認】 ⇒ 更新済内容を確認(更新データを上位表示) */ select 1.KEY, 2.A, 1.A, 1.UPD_DT from TABLE_1 1, TABLE_2 2 where 1.A = 2.A order by 1.UPD_DT desc, 1.KEY ; /*【Commit or Rollback】*/ /* 結果が OK と思われる時 */ /* commit; */ /* 結果が NG と思われる時 */ /* rollback; */ |
上記、「and coalesce(1.A,'') <> coalesce(2.A,'')」 を 「and 1.A <> 2.A」 とすると NULL 値が比較できずに NG。