DUAL в Oracle SQL — 100 практических примеров

Есть в Oracle одна маленькая, почти медитативная штука — DUAL.
Таблица крошечная, а пользы в ней море. Хочешь быстро проверить выражение,
вызвать функцию, собрать тестовый SELECT,
подготовить константы для INSERT
или просто на лету что-то вычислить — она рядом.
Люблю этот инструмент за чистоту: ничего лишнего, только ты, выражение и результат.

Синтаксис

SELECT expression
FROM DUAL

В Oracle DUAL обычно используют там, где нужно получить одно вычисленное значение
без обращения к пользовательским таблицам. Это особенно красиво в тестах,
диагностике, генерации дат, строк, идентификаторов и вызовах встроенных функций.

Где используют

  • быстрые проверки выражений и встроенных функций
  • формирование константных наборов через SELECT
  • подготовка значений для INSERT
  • генерация дат, времени, GUID, случайных чисел
  • построение тестовых запросов без создания таблиц

100 примеров

1. Возврат простой константы

SELECT 'hello' AS greeting
FROM DUAL

2. Числовое выражение без таблиц

SELECT 2 + 3 * 4 AS result
FROM DUAL

3. Получение текущей даты

SELECT SYSDATE AS current_date
FROM DUAL

4. Получение текущей временной метки

SELECT SYSTIMESTAMP AS current_ts
FROM DUAL

5. Текущий пользователь сессии

SELECT USER AS current_user
FROM DUAL

6. Форматирование даты через TO_CHAR

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') AS iso_date
FROM DUAL

7. Парсинг строки в дату через TO_DATE

SELECT TO_DATE('2026-03-22','YYYY-MM-DD') AS dt
FROM DUAL

8. Приведение строки к числу

SELECT TO_NUMBER('1500') AS num_val
FROM DUAL

9. Склейка строк

SELECT 'Ora' || 'cle' AS full_word
FROM DUAL

10. Верхний регистр через UPPER

SELECT UPPER('oracle sql') AS txt
FROM DUAL

11. Нижний регистр через LOWER

SELECT LOWER('ORACLE SQL') AS txt
FROM DUAL

12. Удаление пробелов по краям

SELECT TRIM('  data  ') AS cleaned
FROM DUAL

13. Длина строки

SELECT LENGTH('database') AS len
FROM DUAL

14. Извлечение подстроки

SELECT SUBSTR('oracle',1,3) AS part
FROM DUAL

15. Поиск позиции символа

SELECT INSTR('oracle sql','sql') AS pos
FROM DUAL

16. Замена фрагмента строки

SELECT REPLACE('red,blue','blue','green') AS txt
FROM DUAL

17. Округление числа

SELECT ROUND(15.678,2) AS rounded
FROM DUAL

18. Усечение дробной части через TRUNC

SELECT TRUNC(15.678,1) AS truncated
FROM DUAL

19. Модуль числа

SELECT ABS(-45) AS abs_val
FROM DUAL

20. Степень числа

SELECT POWER(2,10) AS pow_val
FROM DUAL

Еще 20 примеров

21. Квадратный корень

SELECT SQRT(144) AS root_val
FROM DUAL

22. Остаток от деления

SELECT MOD(17,5) AS remainder
FROM DUAL

23. Выбор большего из двух значений

SELECT GREATEST(10,25,7) AS max_val
FROM DUAL

24. Выбор меньшего из двух значений

SELECT LEAST(10,25,7) AS min_val
FROM DUAL

25. Знак числа через SIGN

SELECT SIGN(-20) AS sign_val
FROM DUAL

26. Возврат значения при NULL через NVL

SELECT NVL(NULL,'fallback') AS val
FROM DUAL

27. Альтернатива через COALESCE

SELECT COALESCE(NULL,NULL,'ok') AS val
FROM DUAL

28. Логика через CASE

SELECT CASE WHEN 5 > 3 THEN 'yes' ELSE 'no' END AS answer
FROM DUAL

29. Короткий выбор через DECODE

SELECT DECODE(2,1,'one',2,'two','other') AS word
FROM DUAL

30. Проверка регулярным выражением

SELECT REGEXP_LIKE('abc123','^[a-z0-9]+$') AS is_ok
FROM DUAL

31. Извлечение по regexp

SELECT REGEXP_SUBSTR('id=55','[0-9]+') AS num_part
FROM DUAL

32. Замена по regexp

SELECT REGEXP_REPLACE('abc-123','[^0-9]') AS only_digits
FROM DUAL

33. Генерация GUID

SELECT SYS_GUID() AS guid_val
FROM DUAL

34. Случайное число

SELECT DBMS_RANDOM.VALUE(1,100) AS rnd_val
FROM DUAL

35. Случайное целое число

SELECT TRUNC(DBMS_RANDOM.VALUE(1,11)) AS rnd_int
FROM DUAL

36. Следующее значение sequence

SELECT seq_orders.NEXTVAL AS next_id
FROM DUAL

37. Текущее значение sequence

SELECT seq_orders.CURRVAL AS curr_id
FROM DUAL

38. Прибавить день к текущей дате

SELECT SYSDATE + 1 AS tomorrow
FROM DUAL

39. Разница в месяцах через MONTHS_BETWEEN

SELECT MONTHS_BETWEEN(DATE '2026-12-31',DATE '2026-01-01') AS diff_m
FROM DUAL

40. Последний день месяца

SELECT LAST_DAY(SYSDATE) AS month_end
FROM DUAL

Еще 20 примеров

41. Первый день следующего месяца

SELECT TRUNC(ADD_MONTHS(SYSDATE,1),'MM') AS next_month_start
FROM DUAL

42. Текущий год

SELECT EXTRACT(YEAR FROM SYSDATE) AS yyyy
FROM DUAL

43. Текущий месяц

SELECT EXTRACT(MONTH FROM SYSDATE) AS mm
FROM DUAL

44. День недели в текстовом виде

SELECT TO_CHAR(SYSDATE,'DAY') AS day_name
FROM DUAL

45. День года

SELECT TO_CHAR(SYSDATE,'DDD') AS day_of_year
FROM DUAL

46. ISO-неделя

SELECT TO_CHAR(SYSDATE,'IW') AS iso_week
FROM DUAL

47. Unix-подобный timestamp в секундах

SELECT (SYSDATE - DATE '1970-01-01') * 86400 AS epoch_seconds
FROM DUAL

48. Интервал из текста

SELECT TO_DSINTERVAL('0 01:30:00') AS ivl
FROM DUAL

49. Прибавить интервал к timestamp

SELECT SYSTIMESTAMP + INTERVAL '2' HOUR AS plus_2h
FROM DUAL

50. Обрезать дату до месяца

SELECT TRUNC(SYSDATE,'MM') AS month_start
FROM DUAL

51. Обрезать дату до года

SELECT TRUNC(SYSDATE,'YYYY') AS year_start
FROM DUAL

52. Форматирование числа как денег

SELECT TO_CHAR(12500.5,'999G999D00') AS money_txt
FROM DUAL

53. Проверка условия через булев индикатор

SELECT CASE WHEN 10 BETWEEN 1 AND 20 THEN 1 ELSE 0 END AS ok_flag
FROM DUAL

54. Конструирование JSON-объекта

SELECT JSON_OBJECT('id' VALUE 1,'name' VALUE 'Alice') AS json_doc
FROM DUAL

55. Конструирование JSON-массива

SELECT JSON_ARRAY('red','green','blue') AS json_arr
FROM DUAL

56. Разбор JSON-значения

SELECT JSON_VALUE('{"x":42}','$.x') AS x_val
FROM DUAL

57. XML-конструирование

SELECT XMLELEMENT("tag",'value') AS xml_val
FROM DUAL

58. Хэш строки

SELECT STANDARD_HASH('oracle','SHA256') AS hash_val
FROM DUAL

59. Base64-представление текста

SELECT UTL_RAW.CAST_TO_VARCHAR2(
  UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('hello'))
) AS b64
FROM DUAL

60. URL-экранирование строки

SELECT UTL_URL.ESCAPE('a b+c') AS escaped
FROM DUAL

Еще 20 примеров

61. INSERT одной строки через вычисление

INSERT INTO audit_events(id,created_at)
SELECT 1001,SYSDATE
FROM DUAL

62. INSERT с generated GUID

INSERT INTO docs(doc_id)
SELECT SYS_GUID()
FROM DUAL

63. Вставка тестового пользователя

INSERT INTO users(user_id,email)
SELECT seq_orders.NEXTVAL,'demo@example.com'
FROM DUAL

64. Многострочная константная выборка через UNION ALL

SELECT 1 AS id,'A' AS code FROM DUAL
UNION ALL
SELECT 2,'B' FROM DUAL
UNION ALL
SELECT 3,'C' FROM DUAL

65. Карманный справочник статусов

SELECT 'NEW' AS status FROM DUAL
UNION ALL
SELECT 'PAID' FROM DUAL
UNION ALL
SELECT 'DONE' FROM DUAL

66. Генерация чисел от 1 до 10 через CONNECT BY

SELECT LEVEL AS n
FROM DUAL
CONNECT BY LEVEL <= 10

67. Генерация календаря на неделю

SELECT TRUNC(SYSDATE) + LEVEL - 1 AS dt
FROM DUAL
CONNECT BY LEVEL <= 7

68. Генерация часов суток

SELECT LEVEL - 1 AS hh
FROM DUAL
CONNECT BY LEVEL <= 24

69. Генерация месяцев года

SELECT LEVEL AS mm
FROM DUAL
CONNECT BY LEVEL <= 12

70. Серия букв через CHR

SELECT CHR(64 + LEVEL) AS letter
FROM DUAL
CONNECT BY LEVEL <= 5

71. Вспомогательная таблица умножения

SELECT LEVEL AS n, LEVEL * 7 AS x7
FROM DUAL
CONNECT BY LEVEL <= 10

72. Генерация дат начала кварталов

SELECT ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),(LEVEL - 1) * 3) AS q_start
FROM DUAL
CONNECT BY LEVEL <= 4

73. Набор значений для IN-фильтра через subquery

SELECT code
FROM(
  SELECT 'A' AS code FROM DUAL
  UNION ALL
  SELECT 'B' FROM DUAL
  UNION ALL
  SELECT 'C' FROM DUAL
)

74. Проверка существования с EXISTS

SELECT CASE WHEN EXISTS (SELECT 1 FROM DUAL) THEN 'Y' ELSE 'N' END AS has_row
FROM DUAL

75. Сравнение через ALL

SELECT CASE WHEN 10 > ALL(SELECT 3 FROM DUAL UNION ALL SELECT 5 FROM DUAL) THEN 'ok' ELSE 'fail' END AS res
FROM DUAL

76. Сравнение через ANY

SELECT CASE WHEN 4 = ANY(SELECT 4 FROM DUAL UNION ALL SELECT 9 FROM DUAL) THEN 'ok' ELSE 'fail' END AS res
FROM DUAL

77. Условная развилка на основе даты

SELECT CASE WHEN TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN') THEN 'weekend' ELSE 'weekday' END AS day_type
FROM DUAL

78. Быстрый top-1 тест с FETCH

SELECT LEVEL AS n
FROM DUAL
CONNECT BY LEVEL <= 5
FETCH FIRST 1 ROW ONLY

79. Серия случайных значений

SELECT TRUNC(DBMS_RANDOM.VALUE(100,999)) AS code
FROM DUAL
CONNECT BY LEVEL <= 5

80. Генерация тестовых email

SELECT 'user' || LEVEL || '@example.com' AS email
FROM DUAL
CONNECT BY LEVEL <= 5

Еще 20 примеров

81. Вызов пользовательской функции

SELECT tax(1000) AS tax_val
FROM DUAL

82. Вызов package-функции

SELECT pkg_util.now AS now_val
FROM DUAL

83. Получение контекстного значения приложения

SELECT SYS_CONTEXT('USERENV','SESSION_USER') AS session_user
FROM DUAL

84. Проверка схемы по умолчанию

SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS current_schema
FROM DUAL

85. Текущий SID/идентификатор сессии

SELECT SYS_CONTEXT('USERENV','SID') AS sid_val
FROM DUAL

86. Хост клиента

SELECT SYS_CONTEXT('USERENV','HOST') AS host_name
FROM DUAL

87. Имя инстанса

SELECT SYS_CONTEXT('USERENV','INSTANCE_NAME') AS inst_name
FROM DUAL

88. Проверка timezone сессии

SELECT SESSIONTIMEZONE AS sess_tz
FROM DUAL

89. Проверка timezone базы

SELECT DBTIMEZONE AS db_tz
FROM DUAL

90. Текущая дата с timezone пользователя

SELECT CURRENT_DATE AS curr_dt
FROM DUAL

91. Текущий timestamp пользователя

SELECT CURRENT_TIMESTAMP AS curr_ts
FROM DUAL

92. Метка времени UTC

SELECT SYS_EXTRACT_UTC(SYSTIMESTAMP) AS utc_ts
FROM DUAL

93. Проверка имени базы

SELECT SYS_CONTEXT('USERENV','DB_NAME') AS db_name
FROM DUAL

94. Генерация slug из текста

SELECT LOWER(REPLACE(TRIM('Hello Oracle SQL'),' ','-')) AS slug_val
FROM DUAL

95. Удаление HTML-тегов regexp-ом

SELECT REGEXP_REPLACE('<b>bold</b>','<[^>]+>') AS plain_txt
FROM DUAL

96. Вычисление контрольной суммы строки

SELECT ORA_HASH('row-data') AS hash_num
FROM DUAL

97. Нормализация телефона

SELECT REGEXP_REPLACE('+1 (555) 123-45-67','\D') AS phone_digits
FROM DUAL

98. Быстрый pivot-like набор констант

SELECT 'Q1' AS q,100 AS amt FROM DUAL
UNION ALL
SELECT 'Q2',120 FROM DUAL
UNION ALL
SELECT 'Q3',140 FROM DUAL
UNION ALL
SELECT 'Q4',160 FROM DUAL

99. Сборка тестового отчёта по месяцам

SELECT TO_CHAR(ADD_MONTHS(TRUNC(SYSDATE,'YYYY'),LEVEL - 1),'YYYY-MM') AS ym
FROM DUAL
CONNECT BY LEVEL <= 12

100. Финальный мини-генератор данных

SELECT LEVEL AS id,
       'item-' || LEVEL AS code,
       TRUNC(DBMS_RANDOM.VALUE(10,100)) AS qty
FROM DUAL
CONNECT BY LEVEL <= 10

Заключение

DUAL — это одна из тех вещей, за которые Oracle хочется уважать ещё сильнее.
Очень маленький объект, но с огромным практическим весом. Он помогает думать быстрее,
проверять идеи без шума и собирать аккуратные тесты прямо в SQL.
Если ты по-настоящему дружишь с Oracle, то рано или поздно начинаешь использовать его почти интуитивно.

Официальная документация Oracle:
https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Selecting-from-the-DUAL-Table.html


 

Понравилась статья? Поделиться с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии