【问题标题】:Replacing null values in MySQL query in when clause在when子句中替换MySQL查询中的空值
【发布时间】:2013-07-19 04:22:29
【问题描述】:

我有一个下面的 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的链接

感谢回复

【问题讨论】:

  • 您已要求在 Name 为 NULL 的情况下报告一个空字符串。将您的空字符串更改为“空”。但是你应该看看函数“COALESCE”。它比 case 语句短。
  • Nps。虽然不是最好的回答!我假设你的“输出”是你得到的,而不是你想要的。另外,假设您确实想要“空”,而不是空字符串。尽管如此,coalesce 还是很棒的(比 IFNULL 更棒!)。

标签: mysql sql


【解决方案1】:

Null 值在 SQL 中是特殊的,你不能把它们当作普通的表达式。尽管您可以将NULL 分配给列,但您不能将其与正常值进行比较;如果任一参数为NULL,则所有比较函数都返回NULL,并将其视为假(因此NULL = NULL1 <> NULL 均为假)。您需要使用特殊表达式与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

【讨论】:

  • Chuck Norris 是 SQL 的 NULL,没有什么能比得上他!
【解决方案2】:

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

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 的逻辑将无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多