[英]Oracle: CASE equivalent of DECODE
I am having problem in writing (and understanding) CASE equivalent of DECODE for the example below. 对于下面的示例,我在编写(和理解)相当于DECODE的CASE时遇到问题。
Lets say we have the following table. 可以说我们有下表。
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)
Now, I woud like to run a report which displays information about bosses and subordinates of male employees. 现在,我想运行一个报告,该报告显示有关男性雇员的老板和下属的信息。 In case if employee does not have a subordinate, then it should display (null), same goes for an employee who does not have a boss - boss of the whole company. 如果员工没有下属,则应显示(空),对于没有老板的员工(整个公司的老板)也是如此。
The above can be achieved using DECODE: 以上可以使用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';
The above function will change all NULL
values into 'M'
and match rows where 'M' = 'M'
for ' Boss
' and ' Subordinates
' columns. 上面的函数会将所有NULL
值更改为'M'
并匹配“ Boss
”和“ Subordinates
”列的'M' = 'M'
”行。
I am unable to write equivalent statement using CASE
. 我无法使用CASE
编写等效语句。 The one I got: 我得到的一个:
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';
I seem to be misunderstanding usage of CASE
as it returns less rows - without (null)
values. 我似乎误解了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';
When comparing a value to null, use IS NULL and IS NOT NULL . 将值与null比较时,请使用IS NULL和IS NOT NULL。
You don't need case
or decode
for this: 您不需要case
或decode
:
WHERE (E1.ID IS NULL OR E1.sex = 'M') AND
(E2.ID IS NULL OR E2.sex = 'M')
Your logic would work as well, except that you have put the NULL
in single quotes. 除了将NULL
放在单引号之外,您的逻辑也将正常工作。 The string values with four characters N,U, L, L is not the same as the built-in value NULL
. 具有四个字符N,U,L,L的字符串值与内置值NULL
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.