任何人都可以帮助我理解oracle中CASE WHEN语句的工作。
示例数据。
我的表员工如下所示。
+--------+------------+-----------+
| emp_id | first_name | last_name |
+--------+------------+-----------+
| 1 | Foolish | Much |
| 2 | Silly | |
+--------+------------+-----------+
对于第二条记录last_name
, Silly
为空。
现在检查案例。
SELECT CASE
WHEN r.last_name IS NULL THEN 'Last name is null'
ELSE r.last_name
END AS check1,
CASE r.last_name
WHEN null THEN 'Last name is null'
ELSE r.last_name
END AS check2
FROM employee r
这给出了以下结果..
+-------------------+--------+
| check1 | check2 |
+-------------------+--------+
| Much | Much |
| Last name is null | |
+-------------------+--------+
为什么不给出在check2中姓氏为空?我期待它在check1和check2
中给姓氏为空答案 0 :(得分:2)
根据定义,没有任何内容等于NULL
- 甚至不是NULL
:
SQL> SELECT
2 CASE WHEN 1=1 THEN 'true' WHEN 1<>1 THEN 'false' ELSE 'null' END,
3 CASE WHEN 1=NULL THEN 'true' WHEN 1<>NULL THEN 'false' ELSE 'null' END,
4 CASE WHEN NULL=NULL THEN 'true' WHEN NULL<>NULL THEN 'false' ELSE 'null' END
5 FROM DUAL;
CASEW CASEW CASEW
----- ----- -----
true null null
这就是你拥有IS NULL
构造的原因。
如果您要问,这是一个标准的SQL概念,而不是Oracle的怪癖。
编辑:在您的示例中,COALESCE()提供了更清晰的解决方案,它是许多DBMS中可用的标准功能:
SELECT COALESCE(r.last_name, 'Last name is null') AS check1
FROM employee r
答案 1 :(得分:1)
尝试这个选择,你在错误之前错过了单词“is”然后在check2中错过了。你也在check2栏中关键字时放错了地方。
SELECT CASE
WHEN r.last_name IS NULL THEN 'Last name is null'
ELSE r.last_name
END AS check1,
CASE
WHEN r.last_name IS NULL THEN 'Last name is null'
ELSE r.last_name
END AS check2
FROM employee r