Sql Oracle:DECODE的CASE等价物

Sql Oracle:DECODE的CASE等价物,sql,oracle,case,decode,Sql,Oracle,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')

对于下面的例子,我在写(和理解)相当于解码的案例时遇到了问题

假设我们有下表

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),对于并没有整个公司的老板-老板的员工也是如此

可使用解码实现上述功能:

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'
的行匹配

我无法使用
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)

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进行比较时,use为null且不为null


您不需要
案例
解码

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

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

Use
为NULL
。不要使用
='NULL'
=NULL
进行比较谢谢!这解决了一个问题。