MYSQL使用UPDATE,然后使用NULL值

时间:2012-08-18 17:33:10

标签: mysql

我正在试图找出为什么我没有从正在运行的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值以外的所有值。

我做错了什么?

3 个答案:

答案 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

如果bNULL,整个表达式将变为NULL(或者FALSE),但永远不会TRUENOT 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