マスターのテーブルにデータが入っているのにupdateで元のデータが消えないように
データが入っていない場合のみアップデートできる方法を調べていました。
まず下記でデータを用意
create table `table1`
(id string,
name string,
romaji string,
score int64);
insert into `table1`
select '1', '佐藤', 'sato', 20;
insert into `table1`
select '2', '田中', 'tanaka', 25;
insert into `table1`
select '3', '加藤', 'kato', 30;
insert into `table1`
select '4', null, null, null;
insert into `table1`
select '5', null, null, null;
create table `table2`
(id string,
name string,
romaji string,
score int64);
insert into `table2`
select '4', '山田', 'yamada', 40;
insert into `table2`
select '5', '佐々木', 'sasaki', 25;
insert into `table2`
select '6', '金子', 'kaneko', 35;
MERGE `table1` AS T -- アップデートするターゲットのテーブル
USING `table2` AS S -- データソースとなるテーブル
ON T.id = S.id -- Tのid とSのid が一致するかを判定
-- ONの条件がTRUEの場合
WHEN MATCHED THEN
-- 各項目で空白だったら更新、空白でなかったら既存データを入れる処理
UPDATE SET
T.name = CASE WHEN T.name IS NULL THEN S.name
ELSE T.name
END,
T.romaji = CASE WHEN T.romaji IS NULL THEN S.romaji
ELSE T.romaji
END,
T.score = CASE WHEN T.score IS NULL THEN S.score
ELSE T.score
END
-- ONの条件がWALESの場合
WHEN NOT MATCHED THEN
-- INSERTで指定したカラムにVALUESで指定したカラムのデータを追加する
INSERT (id,name,romaji,score)
VALUES (id,name,romaji,score)
最初、下記でいけると思って実行していたのですが、
下記のWHEN MATCHEDの使い方だと一番最初に該当する内容のみ実行されて
以下の処理は飛ばされてしまいました。
MERGE `table1` AS T -- アップデートするターゲットのテーブル
USING `table2` AS S -- データソースとなるテーブル
ON T.id = S.id -- Tのid とSのid が一致するかを判定
WHEN MATCHED AND (T.name is null or T.name = '-') THEN -- ※1.上記のONがTRUE且つTのnameが空白か「-」の場合
UPDATE SET T.name = S.name
WHEN MATCHED AND (T.romaji is null or T.romaji = '-') THEN -- ※2.上記のONがTRUE且つTのromajiが空白か「-」の場合
UPDATE SET T.romaji = S.romaji
WHEN MATCHED AND (T.score is null) THEN -- ※3.上記のONがTRUE且つTのscoreカラムが空白の場合
UPDATE SET T.score = S.score
WHEN NOT MATCHED THEN -- 上記のONがFALSEの場合
INSERT (id,name,romaji,score) -- INSERTで指定したカラムにVALUESで指定したカラムのデータを追加する
VALUES (id,name,romaji,score)
実際に実行してみると下記のようになり
最初のWHENの条件(下記部分)のnameが空白という条件処理はされているが、
それ以降のromajihが空白の時の処理が実行されていません。
WHEN MATCHED AND (T.name is null or T.name = '-') THEN
```
もう一度実行すると

```` SQL
WHEN MATCHED AND (T.romaji is null or T.romaji = '-') THEN
```
上記の条件での処理だけされます。