Oracle:CASE相当于DECODE

时间:2016-03-13 13:38:41

标签: sql oracle case decode

我在编写(和理解)CASE相当于下面示例的DECODE时遇到了问题。

假设我们有下表。

CREATE TABLE Employee(
    first_name VARCHAR2(15) CONSTRAINT nn_first_name NOT NULL,
    last_name VARCHAR2(15) CONSTRAINT nn_last_name NOT NULL,
    sex VARCHAR2(1) CONSTRAINT check_sex CHECK(sex IN ('M', 'F')),
    ID VARCHAR2(15) CONSTRAINT pk_ID PRIMARY KEY,
    boss_ID VARCHAR2(15) CONSTRAINT fk_ID_empl_to_empl REFERENCES Employee(ID)); 

Name       Null     Type         
---------- -------- ------------ 
FIRST_NAME NOT NULL VARCHAR2(15) 
LAST_NAME  NOT NULL VARCHAR2(15) 
SEX                 VARCHAR2(1)  
ID         NOT NULL VARCHAR2(15) 
BOSS_ID             VARCHAR2(15) 

现在,我想编写一份报告,显示有关男性雇员的老板和下属的信息。如果员工没有下属,那么它应该显示(null),同样适用于没有老板的员工 - 整个公司的老板。

使用DECODE可以实现上述目的:

SELECT E1.last_name Boss,
    E2.last_name Subordinate
FROM Employee E1 FULL JOIN Employee E2
    ON E1.ID = E2.boss_ID
WHERE
    DECODE(E1.ID, NULL, 'M', E1.sex) = 'M' AND
    DECODE(E2.ID, NULL, 'M', E2.sex) = 'M';

上述功能会将所有NULL值更改为'M',并匹配'M' = 'M'为' Boss'和' Subordinates'列。

我无法使用CASE编写等效语句。我得到的那个:

SELECT E1.last_name Boss,
    E2.last_name Subordinate
FROM Employee E1 FULL JOIN Employee E2
    ON E1.id = E2.boss_id
WHERE
    (CASE
    WHEN E1.ID = 'NULL' THEN 'M' ELSE E1.sex END) = 'M' 
    AND
    (CASE 
    WHEN E2.ID = 'NULL' THEN 'M' ELSE E2.sex END) = 'M';

我似乎误解了CASE的使用,因为它返回的行数较少 - 没有(null)值。

2 个答案:

答案 0 :(得分:0)

SELECT E1.last_name Boss,
    E2.last_name Subordinate
FROM Employee E1 FULL JOIN Employee E2
    ON E1.id = E2.boss_id
WHERE
    (CASE
    WHEN E1.ID is null THEN 'M' ELSE E1.sex END) = 'M' 
    AND
    (CASE 
    WHEN E2.ID is null THEN 'M' ELSE E2.sex END) = 'M';

将值与null进行比较时,请使用IS NULL且IS NOT NULL。

You can read about it here.

答案 1 :(得分:0)

您不需要casedecode

WHERE (E1.ID IS NULL OR E1.sex = 'M') AND
      (E2.ID IS NULL OR E2.sex = 'M') 

除了将NULL放在单引号中之外,您的逻辑也可以正常工作。具有四个字符N,U,L,L的字符串值与内置值NULL不同。