В чем разница между «оператором» и «функцией» в oracle sql? - PullRequest
0 голосов
/ 16 апреля 2020

Читая различие между функцией декодирования и оператором CASE WHEN, я запутался, понимая, что если оба дают одинаковый результат для простого уравнения, подобного следующему:

DECODE(col1, 'ABC', 'DEF', 'OTHERS' ) AS COL2

CASE WHEN COL1 = 'ABC' THEN 'DEF'
        ELSE 'OTHERS'   
     END AS COL2

Тогда что такое Разница между функциональностью функции и оператора?

ps Я знаю, что Кейс способен принимать более сложные уравнения ... Мой вопрос здесь больше о понимании различия между функцией и оператором.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2020

В SQL не существует такой вещи, как «оператор CASE». Ваш пример - CASE выражение . (CASE операторы существуют в PL / SQL.)

Документация гласит: "Выражение - это комбинация одного или нескольких значений, операторов и SQL функций, которые оценивают значение". Таким образом, функция SQL не отличается от выражения, это определенный тип выражения c.

Обратите внимание, что DECODE и CASE ведут себя по-разному при сравнении значений NULL: DECODE считает два NULL должны быть «одинаковыми», что является исключением из правила, согласно которому сравнение NULL с чем-либо имеет «неизвестный» результат.

with data(a, b) as (
  select 1,1 from dual union all
  select 1,null from dual union all
  select null,1 from dual union all
  select null, null from dual
)
select a, b,
  decode(a,b,'same','different') decode_result,
  case when a = b then 'same' else 'different' end case_result
from data;

A      B      DECODE_RESULT CASE_RESULT
------ ------ ------------- -----------
1      1      same          same
1      (null) different     different
(null) 1      different     different
(null) (null) same          different
0 голосов
/ 16 апреля 2020

Функция - это просто капсула некоторых функций. С помощью функции вы можете вызывать функциональность из любой точки мира без явного объяснения. Существуют предопределенные функции, такие как DECODE(), или вы можете определять функции самостоятельно .

Оператор - это что-то вроде select 1 from dual и может содержать функции (select decode(col1,'1','yes','no') from mytable).

Оператор (если вы не находитесь в блоке , который сам может содержать несколько операторов) - это порядок, который вы отправляете в БД, функция является своего рода инструкцией, что делать с данными аргументами .

0 голосов
/ 16 апреля 2020

Я почти уверен, что CASE не существовало в версиях базы данных до 9i Oracle, поэтому вам пришлось использовать DECODE.

Без разницы, они оба будут выполнять одну и ту же работу, но CASE проще в обслуживании. DECODE может вырасти до настоящего монстра , когда нужно делать сложные вещи, с вложенными DECODE s, чтобы вы, вероятно, знали, что делаете, печатая это утверждение, но через месяц вы в глубокой беде, поскольку вы не знаете, что к чему, какая закрывающая скобка закрывает какую открытую скобку, ... настоящий кошмар.

Но, для простых вещей, это вполне нормально. Сохраняет некоторые набрав.

...