1

我有一个下面的 MySQL 表

CREATE TABLE Test(Name VARCHAR(30));

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

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

我尝试了以下查询,但它不起作用

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

输出

Name1
Name2

Name3

Name4

SQLFiddle的链接

谢谢您的回复

4

2 回答 2

6

Null 值在 SQL 中是特殊的,不能将其视为普通表达式。尽管您可以分配NULL给一列,但您无法将其与普通值进行比较;NULL如果任何一个参数为,则所有比较函数都返回NULL,并且这被视为假(因此NULL = NULL1 <> NULL都是假的)。您需要使用特殊表达式与 进行比较NULL。this 最基本的形式是<expression> IS NULL(or <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

有关详细信息,请参阅3.3.4.6。使用 MySQL 文档中的NULL 值

于 2013-07-19T04:24:25.887 回答
1

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

NULL 是比较既不产生真也不产生假结果的值。这是数据库编程固有的三层逻辑的奇怪之处之一。

NULL = NULL  

不是真的。也不是假的。将一个值与 NULL 值进行任何比较的结果都是 NULL 结果,除非您使用内部 SQL " IS 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)布尔值,否则 case 的逻辑将无法正常工作。

于 2013-07-19T04:50:42.283 回答