DECODE в Oracle SQL. Введение
DECODE — компактная конструкция условной логики в Oracle SQL по принципу «if‑then‑else».
Она сравнивает выражение с перечнем значений и возвращает соответствующий результат, иначе — значение по умолчанию.
Удобна для быстрых маппингов, меток в отчётах, сводных подсчётов и лёгких «пивотов» прямо в SQL.
Где используют
- Отчёты: перевод кодов статусов и категорий в подписи.
- Агрегация: условные суммы и количества в одном запросе.
- Форматирование: компактные ветвления в SELECT, ORDER BY и GROUP BY.
- Лёгкие «пивоты»: свод значений по категориям через суммы по условиям.
Синтаксис
DECODE(
expression,
search1, result1,
[ search2, result2, ... , default_result ]
)expression— выражение или столбец для проверки;searchN— значение, с которым сравнивается expression;resultN— результат при совпадении;default_result— результат по умолчанию, если совпадений нет (иначе NULL).
Особенность: внутри DECODE два NULL считаются равными.
100 примеров
1. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;2. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;3. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;4. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;5. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;6. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;7. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;8. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;9. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);10. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;11. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;12. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;13. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;14. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;15. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;16. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;17. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;18. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;19. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;20. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;Еще 20 примеров.
21. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);22. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;23. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;24. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;25. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;26. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;27. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;28. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;29. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;30. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;31. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;32. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;33. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);34. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;35. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;36. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;37. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;38. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;39. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;40. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;Еще 20 примеров.
41. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;42. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;43. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;44. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;45. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);46. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;47. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;48. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;49. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;50. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;51. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;52. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;53. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;54. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;55. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;56. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;57. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);58. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;59. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;60. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;Еще 20 примеров.
61. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;62. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;63. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;64. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;65. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;66. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;67. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;68. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;69. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);70. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;71. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;72. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;73. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;74. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;75. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;76. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;77. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;78. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;79. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;80. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;Еще 20 примеров.
81. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);82. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;83. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;84. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;85. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;86. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;87. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;88. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;89. Псевдо‑пивот сумм по статусам
SELECT
SUM(DECODE(status, 'NEW', amount, 0)) AS amt_new,
SUM(DECODE(status, 'PAID', amount, 0)) AS amt_paid,
SUM(DECODE(status, 'CANCEL', amount, 0)) AS amt_cancel
FROM orders;90. Проверка NULL внутри функции
SELECT
customer_id,
DECODE(email,
NULL, 'no email',
'has email') AS email_state
FROM customers;91. Классификация суммы через SIGN
SELECT
invoice_id,
amount,
DECODE(SIGN(amount - 1000),
-1, 'lt 1000',
0, 'eq 1000',
1, 'gt 1000') AS bucket
FROM invoices;92. Вложенное условие с пояснением
SELECT
order_id,
DECODE(status,
'PAID', DECODE(method, 'CARD', 'Оплачено картой', 'Оплачено'),
'CANCEL', 'Отменено',
'В обработке') AS note
FROM orders;93. Пользовательская сортировка в ORDER BY
SELECT
order_id,
status
FROM orders
ORDER BY
DECODE(status,
'NEW', 1,
'PAID', 2,
'CANCEL', 3,
99);94. Фильтрация в WHERE по условию
SELECT
*
FROM orders
WHERE
DECODE(status, 'PAID', 1, 0) = 1;95. Маппинг ролей с NVL
SELECT
user_id,
DECODE(NVL(role, 'NONE'),
'ADMIN', 'Admin',
'User') AS role_label
FROM users;96. Счетчики логов по уровням
SELECT
SUM(DECODE(severity, 'ERR', 1, 0)) AS err_cnt,
SUM(DECODE(severity, 'WARN', 1, 0)) AS warn_cnt,
SUM(DECODE(severity, 'INFO', 1, 0)) AS info_cnt
FROM logs;97. Перевод статусов в подписи
SELECT
order_id,
DECODE(status,
'NEW', 'Новый',
'PAID', 'Оплачен',
'CANCEL', 'Отменён',
'Другое') AS status_name
FROM orders;98. Метки методов оплаты
SELECT
payment_id,
DECODE(method,
'CARD', 'Карта',
'CASH', 'Наличные',
'WIRE', 'Перевод',
'Иное') AS method_name
FROM payments;99. Маппинг грейдов в баллы
SELECT
student_id,
DECODE(grade,
'A', 5,
'B', 4,
'C', 3,
0) AS grade_value
FROM students;100. Подсчет количества по регионам
SELECT
SUM(DECODE(region, 'N', 1, 0)) AS north_cnt,
SUM(DECODE(region, 'S', 1, 0)) AS south_cnt,
SUM(DECODE(region, 'E', 1, 0)) AS east_cnt
FROM sales;Частые ошибки и подводные камни
- Типографские кавычки. В SQL используйте только прямые ASCII‑кавычки:
'строка',"имя". - Неявные преобразования типов. При разных типах Oracle может конвертировать значения. Лучше приводить явно:
TO_CHAR,TO_NUMBER,TO_DATE. - Сравнение с NULL. В
DECODENULL = NULL— совпадение. Это отличается от обычного=. - Читаемость. Большое число веток проще читать через
CASE. - NLS/регистр. Для нечувствительности к регистру нормализуйте:
UPPER(col)иUPPER('abc').
DECODE vs CASE
- DECODE — короче для «равно → результат», удобно для маппингов и счётчиков.
- CASE — универсальнее (диапазоны, сложные условия), читается лучше при множестве веток.
Практика: простые маппинги и быстрые счётчики — DECODE; всё сложнее — CASE.
Заключение
DECODE — быстрый инструмент для компактной условной логики прямо в запросах Oracle SQL.
Он подходит для отчётов, «псевдо‑пивотов» и маркировки значений. Зная особенности (типизация и NULL),
вы сможете писать короче и понятнее.
Документация
Oracle Database SQL Language Reference — DECODE