DECODE ФУНКЦИЯ

В этом учебном пособии вы узнаете, как использовать Oracle/PLSQL функцию DECODE с синтаксисом и примерами.

Описание

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 можно использовать в следующих версиях Oracle/PLSQL:

  • Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i

Пример

Вы можете использовать функцию DECODE в SQL запросе следующим образом:

Запрос с использованием DECODE эквивалентен конструкции IF-THEN-ELSE.

Функция DECODE будет сравнивать каждое значение supplier_id, одно за другим.

Часто задаваемые вопросы

Вопрос:

Один из наших читателей хотел узнать, как использовать функцию DECODE чтобы сравнить две даты (то есть: date1 и date2), где date1 > date2, функция DECODE должны вернуться date2. В противном случае, функция DECODE должна вернуть date1.

Ответ:

Для этого, используйте функцию DECODE следующим образом:

DECODE((date1 — date2) — ABS(date1 — date2), 0, date2, date1)

Приведенная ниже формула будет равна 0, если date1 больше date2:

(date1 — date2) — ABS(date1 — date2)

Полезный совет № 1:

Один из наших читателей предложил объединить функцию SIGN с функцией DECODE следующим образом:

Пример с датами выше, может быть модифицированы следующим образом:

DECODE(SIGN(date1-date2), 1, date2, date1)

Сочетание SIGN / DECODE также полезно для цифровых сравнений например продажа бонусов.

DECODE(SIGN(actual-target), -1, ‘Нет бонусов для тебя’, 0,’Просто сделай это’, 1, ‘Поздравляю, вы победитель’)

Полезный совет № 2:

Один из наших читателей предложил использовать функцию LEAST (вместо функции DECODE) следующим образом:

Пример с датами выше, может быть модифицированы следующим образом:

LEAST(date1, date2)

Вопрос:

Я хотел бы знать, если это возможно, чтобы использовать функцию DECODE для диапазонов чисел, то есть 1-10 = ‘категория 1’, 11-20 = ‘категорию 2’, вместо того, чтобы индивидуально декодировать каждый номер.

Ответ:

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

Например:

Этот пример, на основе формулы:

TRUNC ((supplier_id — 1) / 10

Формула будет оценивать 0, если supplier_id находится между 1 и 10.
Формула будет оценивать в 1, если supplier_id между 11 и 20.
Формула будет оценивать по 2, если supplier_id между 21 и 30.

Вопрос:

Мне нужно написать запрос DECODE, который будет возвращать следующие:

Если yrs_of_service <1, то вернуть 0,04 Если yrs_of_service> = 1 и <5, то вернуть 0,04 Если yrs_of_service> 5 затем вернуть 0,06

Как я могу это сделать?

Ответ:

Вам нужно будет создать формулу, которая рассчитает единичное число для каждого из вашего диапазона.

Например:

Вопрос:

Есть ли ограничение на количество аргументов, которые вы можете указать в одном операторе DECODE? Я получаю сообщение об ошибке «ORA-00939: слишком много аргументов для функции«.

Ответ:

Да, максимальное количество компонентов, которые вы можете иметь в функции DECODE 255. Это включая expression, search и result аргументы.