Подтвердить что ты не робот

CASE против DECODE

Ссылаясь на предыдущий question, мне было интересно, можно ли всегда заменить DECODE на CASE и какой из них лучше для производительности?

4b9b3361

Ответ 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.