DECODE в Oracle SQL — компактная конструкция условной логики

🟢 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;

Частые ошибки и подводные камни

  1. Типографские кавычки. В SQL используйте только прямые ASCII‑кавычки: 'строка', "имя".
  2. Неявные преобразования типов. При разных типах Oracle может конвертировать значения. Лучше приводить явно: TO_CHAR, TO_NUMBER, TO_DATE.
  3. Сравнение с NULL. В DECODE NULL = NULL — совпадение. Это отличается от обычного =.
  4. Читаемость. Большое число веток проще читать через CASE.
  5. NLS/регистр. Для нечувствительности к регистру нормализуйте: UPPER(col) и UPPER('abc').

DECODE vs CASE

  • DECODE — короче для «равно → результат», удобно для маппингов и счётчиков.
  • CASE — универсальнее (диапазоны, сложные условия), читается лучше при множестве веток.

Практика: простые маппинги и быстрые счётчики — DECODE; всё сложнее — CASE.

Заключение

DECODE — быстрый инструмент для компактной условной логики прямо в запросах Oracle SQL.
Он подходит для отчётов, «псевдо‑пивотов» и маркировки значений. Зная особенности (типизация и NULL),
вы сможете писать короче и понятнее.

Документация

Oracle Database SQL Language Reference — DECODE


🔜 Следующая статья:

REPLACE в Oracle SQL — как заменить символы и подстроки в тексте



Понравилась статья? Поделиться с друзьями: