Ссылаясь на предыдущий question, мне было интересно, можно ли всегда заменить DECODE на CASE и какой из них лучше для производительности?
CASE против DECODE
Ответ 1
Как всегда с Oracle... AskTom...
Из этого post...
Декодирование несколько неясное - CASE очень очень понятно. Вещи, которые легко сделать в декодировании, легко сделать в CASE, вещи, которые тяжелы или близки невозможно сделать с декодированием делать в CASE. CASE, логический мудрый, выигрывает руки вниз.
С точки зрения производительности кажется, что они примерно одинаковы, снова в статье упоминаются некоторые различия в скорости, но без сравнения конкретных заявлений, которые трудно сказать.
Ответ 2
Существует одна большая разница между DECODE
и CASE
, и это связано с тем, как сравнивать NULLs
. DECODE
вернет "true", если вы сравните NULL
с NULL
. CASE
не будет. Например:
DECODE(NULL, NULL, 1, 0)
вернет '1'.
CASE NULL
WHEN NULL THEN 1
ELSE 0
END
вернет '0'. Вы должны написать это как:
CASE
WHEN NULL IS NULL THEN 1
ELSE 0
END
Ответ 3
CASE - это оператор, а DECODE - это функция. Мы можем использовать CASE в предложении where и не можем использовать DECODE в предложении where. DECODE может проверять операторы равенства только тогда, когда CASE может поддерживать все реляционные операторы. DECODE может использоваться в SQL только в тех случаях, когда CASE может использоваться в SQL, а PL/SQL CASE лучше, чем DECODE.
Вы можете найти больше: http://www.oraclegeneration.com/2014/01/sql-query-interview-questions.html
Ответ 4
С точки зрения производительности, в Oracle декодирования и CASE не имеет никакого значения.
Но в Exadata декодирование происходит быстрее, чем CASE.
Операция декодирования выполняется на уровне сервера хранения, где присутствуют данные, НО СЛУЧАЙ выполняется на уровне экземпляра БД, который получает данные с уровня хранения БД.
Несмотря на то, что передача данных по сети между хранилищем и сервером БД меньше (соединение Infiniband), такая передача исключается при использовании декодирования статистики
Ответ 5
select (DECODE(NULL, NULL, 1, 0)) from dual;
select (CASE
WHEN NULL IS NULL THEN 1
ELSE 0
END
)
from dual;
оба возвращаются 1
Ответ 6
Сравнение от NULL до NULL возвращает значение как 1 вместо DECODE, возвращающего значение 1, и CASE, возвращающегося как 0.