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 Комментарии