NULL でコンペアするの、できたーっっ!!!! | 踏まれたり蹴られたり...._| ̄|○

踏まれたり蹴られたり...._| ̄|○

「踏んだり蹴ったり」って....あーた、被害者なら「踏まれたり蹴られたり」ってのが正しいんぢゃない??日本語ってばむつかしい...._| ̄|○  (BTW, ついでに、人も指せない「足の親指のトナリの指」を何て呼べばしっくりくるのか、教えてヱライひとっ!!)

(こちらも、関係者以外はスルーでよろしこ。)


検索に検索に検索に検索を重ねて、やっと、やっと、やっと見つけたーっっ!!!!

【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。