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。
答案 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 | 为空 |
|
db
答案 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
,这就是匹配的原因。