Oracle/PLSQL функция DECODE имеет функциональные возможности оператора IF-THEN-ELSE.
Синтаксис Oracle/PLSQL функции DECODE:
DECODE( expression , search , result [, search , result]… [, default] )
expression — выражение для сравнения.
search — значение, которое сравнивается с expression.
result — значение, возвращаемое, если выражение expression совпало с искомым search.
default — необязательный. Если совпадений не найдено, функция DECODE вернет значение по умолчанию. Если значение по умолчанию не указано, то функция DECODE вернет NULL (если соответствий не найдено).
Использование DECODE
| Условие | Использование DECODE | Альтернативный вариант |
| A<B | Decode(Sign(A-B), -1, 1, 0) | |
| A<=B | Decode(Sign(A-B), 1, 0, 1) | |
| A>B | Decode(Sign(A-B), 1, 1, 0) | |
| A>=B | Decode(Sign(A-B), -1, 0, 1) | |
| A=B | Decode(A, B, 1, 0) | |
| A between B and C | Decode(Sign(A-B), -1, 0, Decode(Sign(A-C), 1, 0, 1) | |
| A is null | Decode(A, null, 1, 0) | |
| A is not null | Decode(A, null, 0, 1) | |
| A in (B1,B2, … Bn) | Decode(A, B1, 1, B2, 1, … Bn, 1, 0) | |
| nor LogA | Decode(LogA, 0, 1, 0) | (1 - Sign(LogA)) |
| LogA and LogB | LogA * LogB | |
| LogA or LogB | LogA + LogB | |
| LogA xor LogB | Decode(Sign(LogA), Sign(LogB), 0, 1) | Mod(Sign(LogA, Sign(LogB), 2) |
Ограничение на количество аргументов, которые можно указать в одном операторе DECODE - 255. Это включая expression, search и result аргументы.
select decode(column, null, 1, 0) from table
Результат при column is null : 1
Немного о NULLКогда спорят о NULL, хочется подбросить ссылку на философские трактаты о пустоте и великом "ничто" и посоветовать познать дзен😁
Помедитируем и посмотрим внимательно на системные функции IS NULL и IS NOT NULL. Оператор IS как бы намекает, что не следует взвешивать, измерять, сравнивать, дробить на части любыми арифметическими и логическими операциями. Объект всего лишь является (IS) полным или пустым.
Если относиться к NULL к полному отсутствию чего-либо - пустоте, то легко выстроить логику любых операций NULL.
1. NULL не равно ни логическому значению FALSE, ни пустой строке, ни нулю, ничему вообще.
2. При сравнении NULL с любым значением будет получен результат NULL, а не FALSE и не 0.
3. Более того, NULL != NULL.
4. NULL может присваиваться любому формату данных.
5. NULL может передаваться в процедуры и функции.
6. Любая операция сравнения с NULL или NULL=NULL дает результат UNKNOWN.
7. Агрегатные и аналитические функции игнорируют NULL в пользу допустимых значений массива, AVG вообще не учтет строки. Только СOUNT(null всех значений) = 0.
8. Существуют специальные системные функции Is Null, Is Not Null, возвращающие TRUE/FALSE.
9. Существуют специальные преобразующие функции nvl, nvl2, nullif, coalesce.
10. NULL и пустая строка (varchar2 '') эквивалентны.
Примеры
троичной логики Oracle: TRUE, FALSE и UNKNOWN.
| Condition | Value of A | Evaluation |
| a IS NULL | 10 | FALSE |
| a IS NOT NULL | 10 | TRUE |
| a IS NULL | NULL | TRUE |
| a IS NOT NULL | NULL | FALSE |
| a = NULL | 10 | UNKNOWN |
| a != NULL | 10 | UNKNOWN |
| a = NULL | NULL | UNKNOWN |
| a != NULL | NULL | UNKNOWN |
| a = 10 | NULL | UNKNOWN |
| a != 10 | NULL | UNKNOWN |
CAST(NULL AS VARCHAR2(10))
<.. skip ..>
IN и EXISTS
select 'true' from dual where exists (select 0 from dual where null is null);
| Значения | Результат |
| Алгебра выражения AND | |
| TRUE AND TRUE | TRUE |
| FALSE AND TRUE | FALSE |
| TRUE AND FALSE | FALSE |
| FALSE AND FALSE | FALSE |
| NULL AND TRUE | NULL |
| TRUE AND NULL | NULL |
| FALSE AND NULL | FALSE |
| NULL AND FALSE | FALSE |
| NULL AND NULL | NULL |
| Алгебра выражения OR | |
| TRUE OR TRUE | TRUE |
| FALSE OR TRUE | TRUE |
| TRUE OR FALSE | TRUE |
| FALSE OR FALSE | FALSE |
| NULL OR TRUE | TRUE |
| TRUE OR NULL | TRUE |
| FALSE OR NULL | NULL |
| NULL OR FALSE | NULL |
| NULL OR NULL | NULL |
| Алгебра выражения NOT | |
| NOT TRUE | FALSE |
| NOT FALSE | TRUE |
| NOT NULL | NULL |
Источники:


0 Комментарии