CASE WHEN如何在oracle中运行?

时间:2014-05-07 09:19:34

标签: sql database oracle

任何人都可以帮助我理解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

中给姓氏为空

2 个答案:

答案 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