我正在试图找出为什么我没有从正在运行的MySQL查询中获得结果。
我正在尝试用查询中的数字替换NULL
值,但我无法弄清楚我做错了什么。
这是我的疑问:
UPDATE Details
SET HowHear_ID = CASE HowHear_ID
WHEN '' THEN 25
WHEN NULL THEN 25
WHEN 7 THEN 25
WHEN 8 THEN 5
WHEN 16 THEN 25
WHEN 17 THEN 16
END
WHERE HowHear_ID IN ('',NULL,7,8,16,17)
此查询将影响除NULL
值以外的所有值。
我做错了什么?
答案 0 :(得分:4)
在SQL中,任何值都不会等于(或“不等于”)NULL
。理解以下真值表:
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
放在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
代替。这样做:
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)
答案 1 :(得分:1)
您无法在NULL
子句中引用WHERE
并获得您期望的结果。 NULL
与其他值的行为不同。
如果需要引用它,则需要使用isnull()
函数。
在你的情况下,你会写这样的东西:
WHERE HowHear_ID IN ('',7,8,16,17) or isnull(HowHear_ID)
顺便说一下,您还没有指定字段的数据类型。我认为它是一个整数。在这种情况下,检查零而不是空字符串可能更好? (如果它不是整数,则可能应该是)
答案 2 :(得分:1)
您可以使用
实现这一目标WHERE HowHear_ID IN ('',7,8,16,17) OR HowHear_ID IS NULL