У меня возникла проблема в письменном виде (и понимании) эквивалент 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)
значений.
Используйте 'IS NULL'. Не сравнивайте с помощью '= 'NULL'' или' = NULL' – lad2025
[Есть ли разница между IS NULL и = NULL] (http://stackoverflow.com/questions/3777230/is-there-any-difference-between -is-null-and-null) – lad2025
Спасибо! Это решило проблему. –