ESCAPE в Oracle SQL — как использовать спецсимволы в LIKE-поисках

🟢 ESCAPE в Oracle SQL. Введение

Есть вещи в Oracle SQL, которые на вид маленькие, а в реальной работе спасают очень часто.
ESCAPE — как раз из таких. Когда ты работаешь с LIKE,
символы % и _ — это шаблоны, а не обычные символы.
Но в жизни регулярно нужно искать текст, где процент, подчёркивание или сам символ экранирования —
это часть данных, а не спецсинтаксис. И вот тут ESCAPE делает SQL спокойным, точным и предсказуемым.

Синтаксис

SELECT column_name
FROM table_name
WHERE column_name LIKE 'pattern' ESCAPE '\'

Смысл простой: ты выбираешь один символ-экранировщик и говоришь Oracle,
что если этот символ стоит перед % или _,
их нужно понимать буквально, а не как маски.
Точно так же можно искать и сам символ экранирования, если продублировать его внутри шаблона.

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

  • поиск строк с буквальным % в тексте
  • поиск значений с символом _, который иначе работает как шаблон одного символа
  • фильтрация логинов, кодов, артикулов и email, где спецсимволы — часть данных
  • безопасная работа с пользовательскими шаблонами в WHERE
  • условия в SELECT, UPDATE, DELETE, MERGE

100 примеров

1. Буквальный символ подчёркивания в имени

SELECT username
FROM users
WHERE username LIKE '%\_%' ESCAPE '\'

2. Буквальный процент в коде скидки

SELECT promo_code
FROM promo_codes
WHERE promo_code LIKE '%\%%' ESCAPE '\'

3. Поиск значения A_B как текста, а не шаблона

SELECT code_val
FROM code_dict
WHERE code_val LIKE 'A\_B' ESCAPE '\'

4. Поиск значения 50%OFF с буквальным процентом

SELECT promo_code
FROM promo_codes
WHERE promo_code LIKE '50\%OFF' ESCAPE '\'

5. Строки, начинающиеся с символа подчёркивания

SELECT file_name
FROM files
WHERE file_name LIKE '\_%' ESCAPE '\'

6. Строки, заканчивающиеся на символ процента

SELECT label_txt
FROM labels
WHERE label_txt LIKE '%\%' ESCAPE '\'

7. Поиск email с подчёркиванием до @

SELECT email
FROM users
WHERE email LIKE '%\_%@%' ESCAPE '\'

8. Поиск SKU с буквальным шаблоном XX_01

SELECT sku
FROM products
WHERE sku LIKE 'XX\_01' ESCAPE '\'

9. Значение, содержащее и подчёркивание, и процент

SELECT code_val
FROM code_dict
WHERE code_val LIKE '%\_\%%' ESCAPE '\'

10. Поиск буквального шаблона file_2026%

SELECT file_name
FROM files
WHERE file_name LIKE 'file\_2026\%' ESCAPE '\'

11. Использование @ как символа экранирования

SELECT username
FROM users
WHERE username LIKE '%@_%' ESCAPE '@'

12. Использование ! как символа экранирования

SELECT promo_code
FROM promo_codes
WHERE promo_code LIKE '%!%%' ESCAPE '!'

13. Использование # для буквального подчёркивания

SELECT code_val
FROM code_dict
WHERE code_val LIKE 'AB#_CD' ESCAPE '#'

14. Поиск шаблона 100%_DONE с одним escape-символом

SELECT status_txt
FROM status_log
WHERE status_txt LIKE '100\%\_DONE' ESCAPE '\'

15. Буквальный процент внутри середины строки

SELECT metric_name
FROM metrics
WHERE metric_name LIKE '%CPU\%%' ESCAPE '\'

16. Буквальное подчёркивание внутри логина

SELECT login
FROM user_login
WHERE login LIKE '%admin\_%' ESCAPE '\'

17. Поиск строки, где сначала идёт underscore, потом цифра

SELECT tag_name
FROM tags
WHERE tag_name LIKE '\_1%' ESCAPE '\'

18. Поиск строки, начинающейся с процента

SELECT code_val
FROM code_dict
WHERE code_val LIKE '\%%' ESCAPE '\'

19. Поиск строки, состоящей из буквального A_B_C

SELECT code_val
FROM code_dict
WHERE code_val LIKE 'A\_B\_C' ESCAPE '\'

20. Буквальное совпадение с report_2026%.csv

SELECT file_name
FROM files
WHERE file_name LIKE 'report\_2026\%.csv' ESCAPE '\'

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

21. Поиск самого символа экранирования через его удвоение

SELECT path_txt
FROM file_paths
WHERE path_txt LIKE '%\\%' ESCAPE '\'

22. Поиск значения с символом @ при @ как escape

SELECT email
FROM users
WHERE email LIKE '%@@example.com%' ESCAPE '@'

23. Два escape-символа подряд внутри шаблона

SELECT path_txt
FROM file_paths
WHERE path_txt LIKE 'C:\\\\temp%' ESCAPE '\'

24. Поиск буквального шаблона %DONE%

SELECT status_txt
FROM status_log
WHERE status_txt LIKE '\%DONE\%%' ESCAPE '\'

25. Поиск username, где есть символы _% подряд

SELECT username
FROM users
WHERE username LIKE '%\_\%%' ESCAPE '\'

26. Буквальный шаблон __init__

SELECT code_val
FROM code_dict
WHERE code_val LIKE '\_\_init\_\_' ESCAPE '\'

27. Поиск markdown-подобного 100_%

SELECT note_txt
FROM notes
WHERE note_txt LIKE '100\_\%' ESCAPE '\'

28. Фильтр по slug с буквальным underscore в середине

SELECT slug_val
FROM article_slug
WHERE slug_val LIKE '%release\_candidate%' ESCAPE '\'

29. Поиск product code вида A_%_01

SELECT sku
FROM products
WHERE sku LIKE 'A\_\%\_01' ESCAPE '\'

30. Поиск пути, где есть каталог _archive

SELECT path_txt
FROM file_paths
WHERE path_txt LIKE '%\_archive%' ESCAPE '\'

31. Буквальный шаблон 20%_READY в статусе

SELECT status_txt
FROM status_log
WHERE status_txt LIKE '20\%\_READY' ESCAPE '\'

32. Поиск значения %tmp_ в конце

SELECT file_name
FROM files
WHERE file_name LIKE '%\%tmp\_' ESCAPE '\'

33. Использование $ как символа экранирования

SELECT code_val
FROM code_dict
WHERE code_val LIKE 'A$_B$%' ESCAPE '$'

34. Использование ~ как символа экранирования

SELECT tag_name
FROM tags
WHERE tag_name LIKE '~_%' ESCAPE '~'

35. Поиск буквального процента внутри title

SELECT title
FROM articles
WHERE title LIKE '%\%%' ESCAPE '\'

36. Поиск буквального подчёркивания в city_code

SELECT city_code
FROM city_dim
WHERE city_code LIKE '%\_%' ESCAPE '\'

37. Поиск логина _root как точного шаблона

SELECT login
FROM user_login
WHERE login LIKE '\_root' ESCAPE '\'

38. Поиск строки с буквальным %prod

SELECT env_name
FROM envs
WHERE env_name LIKE '\%prod%' ESCAPE '\'

39. Буквальный шаблон id_%_backup

SELECT code_val
FROM code_dict
WHERE code_val LIKE 'id\_\%\_backup' ESCAPE '\'

40. Поиск процентов в money_label

SELECT money_label
FROM money_label_demo
WHERE money_label LIKE '%\%%' ESCAPE '\'

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

41. Фильтр в UPDATE для строк с буквальным underscore

UPDATE users
SET email = LOWER(email)
WHERE email LIKE '%\_%' ESCAPE '\'

42. UPDATE статуса для кодов с буквальным процентом

UPDATE promo_codes
SET is_active = 0
WHERE promo_code LIKE '%\%%' ESCAPE '\'

43. DELETE временных файлов с _tmp в названии

DELETE FROM files
WHERE file_name LIKE '%\_tmp%' ESCAPE '\'

44. DELETE строк со значением %deprecated%

DELETE FROM notes
WHERE note_txt LIKE '\%deprecated\%%' ESCAPE '\'

45. MERGE по логину с escape-фильтром в source

MERGE INTO user_flags t
USING (
  SELECT user_id,login
  FROM user_login
  WHERE login LIKE '%\_%' ESCAPE '\'
) s
ON (t.user_id = s.user_id)
WHEN MATCHED THEN
  UPDATE SET t.has_underscore = 1
WHEN NOT MATCHED THEN
  INSERT (user_id,has_underscore)
  VALUES (s.user_id,1)

46. INSERT ALL из строк с буквальным %

INSERT INTO percent_codes(code_val)
SELECT promo_code
FROM promo_codes
WHERE promo_code LIKE '%\%%' ESCAPE '\'

47. CASE для маркировки строк с underscore

SELECT username,
       CASE WHEN username LIKE '%\_%' ESCAPE '\' THEN 'HAS_UNDERSCORE' ELSE 'PLAIN' END AS marker
FROM users

48. CASE для маркировки строк с процентом

SELECT promo_code,
       CASE WHEN promo_code LIKE '%\%%' ESCAPE '\' THEN 'HAS_PERCENT' ELSE 'PLAIN' END AS marker
FROM promo_codes

49. Join только по строкам с буквальным _ в code

SELECT p.product_id,c.code_val
FROM products p
JOIN code_dict c ON c.code_val = p.sku
WHERE c.code_val LIKE '%\_%' ESCAPE '\'

50. LIKE с ESCAPE внутри CTE

WITH marked AS (
  SELECT username
  FROM users
  WHERE username LIKE '%\_%' ESCAPE '\'
)
SELECT *
FROM marked

51. Поиск в XML-строке буквального процента

SELECT payload_txt
FROM xml_export
WHERE payload_txt LIKE '%\%%' ESCAPE '\'

52. Фильтр JSON-like текста с буквальным underscore

SELECT json_txt
FROM api_cache_txt
WHERE json_txt LIKE '%\_%' ESCAPE '\'

53. Поиск path C:\temp через буквальный backslash

SELECT path_txt
FROM file_paths
WHERE path_txt LIKE 'C:\\temp%' ESCAPE '\'

54. Поиск шаблона \\server\share

SELECT path_txt
FROM file_paths
WHERE path_txt LIKE '\\\\server\\share%' ESCAPE '\'

55. Буквальный шаблон user_name%

SELECT username
FROM users
WHERE username LIKE 'user\_name\%' ESCAPE '\'

56. Поиск подстроки v1_0%

SELECT version_txt
FROM app_versions
WHERE version_txt LIKE '%v1\_0\%%' ESCAPE '\'

57. Фильтр по note_txt с литеральным 100_%_done

SELECT note_txt
FROM notes
WHERE note_txt LIKE '%100\_\%\_done%' ESCAPE '\'

58. LIKEC с ESCAPE для underscore

SELECT username
FROM users
WHERE username LIKEC '%\_%' ESCAPE '\'

59. LIKE2 с ESCAPE для процента

SELECT promo_code
FROM promo_codes
WHERE promo_code LIKE2 '%\%%' ESCAPE '\'

60. LIKE4 с ESCAPE для шаблона A_B

SELECT code_val
FROM code_dict
WHERE code_val LIKE4 'A\_B' ESCAPE '\'

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

61. Поиск литерального % в начале и _ в конце

SELECT code_val
FROM code_dict
WHERE code_val LIKE '\%%\_' ESCAPE '\'

62. Поиск строки %@_% как текста

SELECT email
FROM users
WHERE email LIKE '\%@\_%' ESCAPE '\'

63. Использование caret как escape-символа

SELECT code_val
FROM code_dict
WHERE code_val LIKE '^_%' ESCAPE '^'

64. Использование slash как escape-символа

SELECT promo_code
FROM promo_codes
WHERE promo_code LIKE '%/%' ESCAPE '/'

65. Фильтр для строк с двумя буквальными underscore подряд

SELECT code_val
FROM code_dict
WHERE code_val LIKE '%\_\_%' ESCAPE '\'

66. Фильтр для строк с двумя буквальными процентами подряд

SELECT status_txt
FROM status_log
WHERE status_txt LIKE '%\%\%%' ESCAPE '\'

67. Поиск user_01% как literal-prefix

SELECT username
FROM users
WHERE username LIKE 'user\_01\%%' ESCAPE '\'

68. Поиск в логах шаблона ERR_%_CRIT

SELECT log_text
FROM logs
WHERE log_text LIKE '%ERR\_\%\_CRIT%' ESCAPE '\'

69. Поиск note с буквальным символом escape @

SELECT note_txt
FROM notes
WHERE note_txt LIKE '%@@%' ESCAPE '@'

70. Комбинация нескольких literal wildcard-символов

SELECT pattern_txt
FROM patterns
WHERE pattern_txt LIKE '%\%\_\%%' ESCAPE '\'

71. Поиск markdown имени file_name_100%

SELECT file_name
FROM files
WHERE file_name LIKE 'file\_name\_100\%%' ESCAPE '\'

72. Фильтр в join по буквальному underscore у обеих сторон

SELECT u.user_id,l.login
FROM users u
JOIN user_login l ON l.user_id = u.user_id
WHERE u.username LIKE '%\_%' ESCAPE '\'
  AND l.login LIKE '%\_%' ESCAPE '\'

73. EXISTS со строками, содержащими процент

SELECT p.product_id
FROM products p
WHERE EXISTS (
  SELECT 1
  FROM notes n
  WHERE n.product_id = p.product_id
    AND n.note_txt LIKE '%\%%' ESCAPE '\'
)

74. NOT EXISTS со строками, содержащими underscore

SELECT u.user_id
FROM users u
WHERE NOT EXISTS (
  SELECT 1
  FROM user_login l
  WHERE l.user_id = u.user_id
    AND l.login LIKE '%\_%' ESCAPE '\'
)

75. Фильтр HAVING по числу literal-percent строк

SELECT category_id,COUNT(*) AS cnt_val
FROM promo_codes
WHERE promo_code LIKE '%\%%' ESCAPE '\'
GROUP BY category_id
HAVING COUNT(*) > 5

76. Window-флаг для строк с escape-поиском

SELECT username,
       SUM(CASE WHEN username LIKE '%\_%' ESCAPE '\' THEN 1 ELSE 0 END)
       OVER() AS total_marked
FROM users

77. Фильтр по первой позиции literal underscore

SELECT code_val
FROM code_dict
WHERE code_val LIKE '\_%' ESCAPE '\'

78. Фильтр по последней позиции literal underscore

SELECT code_val
FROM code_dict
WHERE code_val LIKE '%\_' ESCAPE '\'

79. Фильтр по первой позиции literal percent

SELECT label_txt
FROM labels
WHERE label_txt LIKE '\%%' ESCAPE '\'

80. Фильтр по последней позиции literal percent

SELECT label_txt
FROM labels
WHERE label_txt LIKE '%\%' ESCAPE '\'

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

81. Поиск сразу двух литеральных масок через OR

SELECT code_val
FROM code_dict
WHERE code_val LIKE '%\_%' ESCAPE '\'
   OR code_val LIKE '%\%%' ESCAPE '\'

82. Поиск строк, где есть и % и _ одновременно

SELECT code_val
FROM code_dict
WHERE code_val LIKE '%\%%' ESCAPE '\'
  AND code_val LIKE '%\_%' ESCAPE '\'

83. Поиск login с буквальным app_%

SELECT login
FROM user_login
WHERE login LIKE 'app\_%' ESCAPE '\'

84. Поиск filename с буквальным backup_%_old

SELECT file_name
FROM files
WHERE file_name LIKE 'backup\_\%\_old%' ESCAPE '\'

85. Фильтр note_txt с escape-символом !

SELECT note_txt
FROM notes
WHERE note_txt LIKE '%!_!%%' ESCAPE '!'

86. Поиск строки с literal @@ и _ одновременно

SELECT email
FROM users
WHERE email LIKE '%@@\_%' ESCAPE '\'

87. Генерация флага совпадения в SELECT

SELECT code_val,
       CASE WHEN code_val LIKE 'A\_B\%%' ESCAPE '\' THEN 1 ELSE 0 END AS hit_flag
FROM code_dict

88. Поиск с NVL и ESCAPE

SELECT username
FROM users
WHERE NVL(username,'x') LIKE '%\_%' ESCAPE '\'

89. Поиск в подзапросе с DISTINCT

SELECT DISTINCT username
FROM (
  SELECT username
  FROM users
  WHERE username LIKE '%\_%' ESCAPE '\'
) t

90. Группировка строк, содержащих %

SELECT CASE WHEN promo_code LIKE '%\%%' ESCAPE '\' THEN 'HAS_PERCENT' ELSE 'NO_PERCENT' END AS grp_name,
       COUNT(*) AS cnt_val
FROM promo_codes
GROUP BY CASE WHEN promo_code LIKE '%\%%' ESCAPE '\' THEN 'HAS_PERCENT' ELSE 'NO_PERCENT' END

91. Агрегация только строк с литеральным underscore

SELECT COUNT(*) AS cnt_val
FROM users
WHERE username LIKE '%\_%' ESCAPE '\'

92. Использование escape в correlated subquery

SELECT u.user_id
FROM users u
WHERE EXISTS (
  SELECT 1
  FROM notes n
  WHERE n.user_id = u.user_id
    AND n.note_txt LIKE '%\_%' ESCAPE '\'
)

93. Поиск буквального 100\% как текста, когда escape = !

SELECT note_txt
FROM notes
WHERE note_txt LIKE '%100!%%' ESCAPE '!'

94. Поиск буквального A_B_C%D

SELECT code_val
FROM code_dict
WHERE code_val LIKE 'A\_B\_C\%D' ESCAPE '\'

95. Нормализация фильтра через bind-like выражение с escape

SELECT username
FROM users
WHERE username LIKE :p_pattern ESCAPE '\'

96. Буквальный шаблон _test_%_case

SELECT note_txt
FROM notes
WHERE note_txt LIKE '\_test\_\%\_case' ESCAPE '\'

97. Поиск metric_name с 90%_cpu

SELECT metric_name
FROM metrics
WHERE metric_name LIKE '90\%\_cpu' ESCAPE '\'

98. Поиск article title с literal 100%_guide

SELECT title
FROM articles
WHERE title LIKE '%100\%\_guide%' ESCAPE '\'

99. Проверка строк с двумя escape-символами внутри шаблона

SELECT path_txt
FROM file_paths
WHERE path_txt LIKE '%\\\\server%' ESCAPE '\'

100. Финальный пример: точный фильтр по нескольким литеральным wildcard-символам сразу

SELECT code_val
FROM code_dict
WHERE code_val LIKE '%A\_B\%%' ESCAPE '\'
  AND code_val LIKE '%\_%' ESCAPE '\'
  AND code_val LIKE '%\%%' ESCAPE '\'

Заключение

ESCAPE — один из тех инструментов, которые делают SQL спокойнее и взрослее.
Когда понимаешь, что пользовательские данные часто содержат символы шаблонов,
начинаешь особенно ценить такие маленькие, но точные конструкции.
В Oracle это очень приятно: ты явно говоришь, где шаблон, а где обычный символ —
и запрос становится честным, предсказуемым и безопасным для реальной жизни.

Официальная документация Oracle:
Pattern-matching Conditions


 

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

END в Oracle SQL — как завершать блоки, условия и конструкции


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