2016-03-13 5 views
0

У меня возникла проблема в письменном виде (и понимании) эквивалент CASE DECODE для примера ниже.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')), 
    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' для «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) значений.

+1

Используйте 'IS NULL'. Не сравнивайте с помощью '= 'NULL'' или' = NULL' – lad2025

+0

[Есть ли разница между IS NULL и = NULL] (http://stackoverflow.com/questions/3777230/is-there-any-difference-between -is-null-and-null) – lad2025

+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 и NOT NULL.

You can read about it here.

0

Вам не нужно case или decode для этого:

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

Ваша логика будет работать так же, за исключением того, что вы поставили NULL в одинарные кавычки. Строковые значения с четырьмя символами N, U, L, L не совпадают с встроенным значением NULL.

Смежные вопросы