在when子句中替换MySQL查询中的空值

时间:2013-07-19 04:22:30

标签: mysql sql

我正在将MySQL表作为一个

CREATE TABLE Test(Name VARCHAR(30));

INSERT INTO Test VALUES ('Name1'), 
                        ('Name2'),
                        (null),
                        ('Name3'),
                        (null),
                        ('Name4');

现在当行为空时我希望它在前端显示为空,否则包含在行中的值

我尝试了以下查询但是没有用

SELECT CASE Name 
        WHEN NULL 
        THEN '' ELSE Name
       END AS Names
  FROM Test

输出

Name1
Name2

Name3

Name4

SQLFiddle

的链接

感谢回复

2 个答案:

答案 0 :(得分:6)

Null值在SQL中是特殊的,您不能将它们视为普通表达式。虽然您可以将NULL分配给某列,但您无法与它进行比较,就像它是正常值一样;如果任一参数为NULL,则所有比较函数都返回NULL,并将其视为false(因此NULL = NULL1 <> NULL都为false)。您需要使用特殊表达式与NULL进行比较。最基本的形式是<expression> IS NULL(或<expression> IS NOT NULL),但也有便捷函数IFNULL()COALESCE()

SELECT IFNULL(Name, '') AS Names
FROM Test

SELECT CASE WHEN Name IS NULL
            THEN ''
            ELSE Name
       END AS Names
FROM Test

有关更多信息,请参阅MySQL文档中的3.3.4.6. Working with NULL Values

答案 1 :(得分:1)

只是详细说明为什么这不起作用。

NULL是一个值,对于该值,比较既不会产生true也不会产生false。这是数据库编程固有的三层逻辑的奇特之处。

NULL = NULL  

不是真的。这也不错。除非您使用内部SQL“IS NULL”运算符来测试它,否则将一个值与NULL值进行任何比较的结果都是NULL结果。

您使用的CASE声明形式:

CASE Value
   WHEN TestValue1 THEN xxx
   WHEN TestValue2 THEN yyy
END

针对值运行许多相等测试。您无法在此表单中测试NULL,因为您无法对NULL执行相等性测试。第二种形式的案例:

CASE
   WHEN MyValue IS NULL THEN www
   WHEN Condition1 THEN xxx
   WHEN Condition2 THEN yyy
END

允许您使用IS NULL表达式,可以具有TRUE或FALSE值。因此,当您想在CASE语句中进行NULL测试时,您必须始终使用此表单。

此外,NULL测试应该是CASE语句中的第一项:因为将任何值与NULL进行比较将具有“未确定”(NULL)布尔值,否则案例的逻辑将无法正常工作。