NULL
SQL では値が等しい (または「等しくない」) ことはありません。次の真理値表を理解してください。
NULL = NULL yields NULL -- not FALSE!
NULL != NULL yields NULL -- not TRUE!
[ANY] = NULL yields NULL -- not FALSE!
[ANY] != NULL yields NULL -- not TRUE!
以下は同等なので...
[expression] IN (a, b, c)
[expression] = ANY (a, b, c)
[expression] = a OR [expression] = b OR [expression] = c
NULL
...の右側に置くことはできませんIN predicate
。NULL
興味深いことに、 a の右側に置くと事態はさらに悪化しますNOT IN predicate
。
[expression] NOT IN (a, b, c)
[expression] != ANY (a, b, c)
[expression] != a AND [expression] != b AND [expression] != c
b
だった場合NULL
、式全体はNULL
(または多分FALSE
) になりますが、決して ではありませんTRUE
。これはNOT IN (subselect)
述語にも当てはまります。したがって、これは絶対に行わないでください。
[expression] NOT IN (NULL, 1, 2)
あなたの場合の正しい解決策は、NULL predicate
代わりに a を使用します。これを行う:
UPDATE Details
SET HowHear_ID = CASE
WHEN HowHear_ID = '' THEN 25
WHEN HowHear_ID IS NULL THEN 25 -- Use a NULL predicate here
WHEN HowHear_ID = 7 THEN 25
WHEN HowHear_ID = 8 THEN 5
WHEN HowHear_ID = 16 THEN 25
WHEN HowHear_ID = 17 THEN 16
END
WHERE HowHear_ID IN ('',7,8,16,17)
OR HowHear_ID IS NULL -- Use a NULL predicate here
またはこれ:
WHERE COALESCE(HowHear_ID, '') IN ('',7,8,16,17)