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

时间:2021-06-05 17:03:18

标签: mysql sql 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

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

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

2 个答案:

答案 0 :(得分:1)

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

DB-小提琴:

架构和插入语句:

 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 不为空
2 为空

dbhere

答案 1 :(得分:1)

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

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

注意:userName 后面没有 CASE

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

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

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

这将返回 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,这就是匹配的原因。