はじめに
SQLの
反面、
というわけで、
稼働環境は次のとおりで、
- Oracle9i以降
(Oracle10. 2.0. 1) - SQL Server 2005以降
(SQLServer 2005) - DB2
(DB2 9. 5) - PostgreSQL
(PostgreSQL 8. 3) - MySQL 5.
0以降 (MySQL 5. 0)
NULLが存在するテーブル
NULLの埋め立て
さて、
keycol | seq | Val |
---|---|---|
A | 1 | 50 |
A | 2 | |
A | 3 | |
A | 4 | 70 |
A | 5 | |
A | 6 | 900 |
B | 1 | 10 |
B | 2 | 20 |
B | 3 | |
B | 4 | 3 |
B | 5 | |
B | 6 |
人間ならそういうルールと知っていればすぐわかりますが、
そこで、
- 同じkeycolを持つ
- 自分より小さいseqを持つ
- valがNULLではない
という3つの条件を満たす集合に絞り、
keycol | seq | Val |
---|---|---|
A | 1 | 50 |
A | 2 | 50 ← 埋めた |
A | 3 | 50 ← 埋めた |
A | 4 | 70 |
A | 5 | 70 ← 埋めた |
A | 6 | 900 |
B | 1 | 10 |
B | 2 | 20 |
B | 3 | 20 ← 埋めた |
B | 4 | 3 |
B | 5 | 3 ← 埋めた |
B | 6 | 3 ← 埋めた |
UPDATE OmitTbl
SET val = (SELECT val
FROM OmitTbl O1
WHERE O1.keycol = OmitTbl.keycol ―①同じkeycolを持つ
AND O1.seq = (SELECT MAX(seq)
FROM OmitTbl O2
WHERE O2.keycol = OmitTbl.keycol
AND O2.seq ―②自分より小さいseqを持つ
AND O2.val IS NOT NULL)) ―③valがNULLではない
WHERE val IS NULL;
逆にNULLを作成する
ちなみに、
UPDATE OmitTbl
SET val = CASE WHEN val
= (SELECT val
FROM OmitTbl O1
WHERE O1.keycol = OmitTbl.keycol
AND O1.seq
= (SELECT MAX(seq)
FROM OmitTbl O2
WHERE O2.keycol = OmitTbl.keycol
AND O2.seq ←スカラ・サブクエリ全体をCASE 式の引数としている
THEN NULL
ELSE val END;
先ほどの1~3の条件に合致する行に関してはNULLを、
ちなみに、