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 users48. CASE для маркировки строк с процентом
SELECT promo_code,
CASE WHEN promo_code LIKE '%\%%' ESCAPE '\' THEN 'HAS_PERCENT' ELSE 'PLAIN' END AS marker
FROM promo_codes49. 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 marked51. Поиск в 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(*) > 576. Window-флаг для строк с escape-поиском
SELECT username,
SUM(CASE WHEN username LIKE '%\_%' ESCAPE '\' THEN 1 ELSE 0 END)
OVER() AS total_marked
FROM users77. Фильтр по первой позиции 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_dict88. Поиск с 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 '\'
) t90. Группировка строк, содержащих %
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' END91. Агрегация только строк с литеральным 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