使用带有 IS NULL 和 IS NOT NULL 的 Case 语句

Using a Case Statement With IS NULL and IS NOT NULL

SELECT 
    userid, 
    userName,
    CASE userName
    WHEN (userName IS NULL) THEN 'was null'
        WHEN (userName IS NOT NULL) THEN 'was not null'
    END AS caseExpressionTest
FROM
    top_users

这没有给我想要的结果。当值不为空时,我得到 'was null',当实际为空时,我得到一个实际的 MYSQL NULL 值。我想要的是,当 userName 为 null 时,return 'was null',当 userName 不为 null 时,return 'was not null'。我在这里做错了什么?

我有意尝试使用 CASE 表达式来执行此操作,而不是 IF 或 IFNULL 表达式。
使用 MYSQL 8.0.

SELECT 
    userid, 
    userName,
    CASE WHEN userName IS NULL THEN 'was null' else 'was not null' END AS caseExpressionTest
FROM
    top_users

DB-Fiddle:

架构和插入语句:

 create table top_users (userid int, userName varchar(50));
 insert into top_users values(1,'user1');
 insert into top_users(userid) values(2);

查询:

 SELECT 
         userid, 
         userName,
         CASE WHEN userName IS NULL THEN 'was null' else 'was not null' END AS caseExpressionTest
     FROM
         top_users

输出:

userid userName caseExpressionTest
1 user1 was not null
2 <emnull</em was null

dbhere

您误用了 case 表达式。有两种形式。您想要的表格是:

(CASE WHEN userName IS NULL THEN 'was null'
      WHEN userName IS NOT NULL THEN 'was not null'
 END) AS caseExpressionTest

注:CASE后没有userName

这会检查每个条件在第一个停止。

MySQL 将布尔值解释为有效值。所以你的版本是:

-- when userName is NULL
(CASE userName
    WHEN 0 THEN 'was null'
    WHEN 1 THEN 'was not null'
END AS caseExpressionTest

这将 return NULL

或:

-- when userName is not NULL
(CASE userName
    WHEN 1 THEN 'was null'
    WHEN 0 THEN 'was not null'
END AS caseExpressionTest

据推测,userName是一个字符串。这会将 userName 转换为基于前导数字的整数。如果没有前导数字,您将得到 0,这就是匹配的原因。