LIKE в Oracle SQL. Введение
LIKE — условие сопоставления по шаблону в Oracle SQL. Поддерживает два спецсимвола: % (произвольная подстрока) и _ (один символ).
Для буквального поиска спецсимволов применяется ESCAPE. Часто комбинируется с UPPER/LOWER для регистронезависимого поиска.
Где используют
- Префиксы/суффиксы: выбор строк по началу/концу значения.
- Подстроки: быстрый текстовый фильтр в отчётах.
- Валидация: проверка форматов и выявление «плохих» значений.
- Подготовка данных: разметка категорий по маскам.
🖋️ Синтаксис оператора LIKE
SELECT [столбцы | *]
FROM [таблица]
WHERE столбец LIKE 'шаблон';
Шаблоны:
%— любое количество любых символов_— один любой символ
SELECT * FROM employees WHERE first_name LIKE 'A%';
SELECT * FROM employees WHERE last_name LIKE '_ohn';100 примеров
1. Префиксный фильтр по имени
SELECT customer_id, name
FROM customers
WHERE name LIKE 'A%';2. Суффикс домена в почте
SELECT email
FROM users
WHERE email LIKE '%@gmail.com';3. Поиск подстроки в описании
SELECT product_id, description
FROM products
WHERE description LIKE '%eco%';4. Использование ‘_’ для одного символа
SELECT code
FROM promo
WHERE code LIKE 'A_C';5. Ищем буквальный символ ‘%’ (ESCAPE)
SELECT note
FROM notes
WHERE note LIKE '10\%%' ESCAPE '\';6. Ищем буквальный ‘_’
SELECT path
FROM files
WHERE path LIKE 'A\_B%' ESCAPE '\';7. Регистронезависимость через UPPER
SELECT *
FROM cities
WHERE UPPER(city_name) LIKE UPPER(:p || '%');8. TRIM и шаблон с префиксом
SELECT *
FROM contacts
WHERE TRIM(name) LIKE 'Mr %';9. Маска кириллицей (начало строки)
SELECT person_id, full_name
FROM people
WHERE full_name LIKE 'Ан%';10. Исключаем нежелательные расширения (NOT)
SELECT url
FROM hits
WHERE url NOT LIKE '%.png';11. Несколько масок через OR
SELECT *
FROM orders
WHERE status LIKE 'NEW%'
OR status LIKE 'PEND%';12. Комбинация с AND
SELECT *
FROM orders
WHERE order_no LIKE '2025-%'
AND customer_id LIKE 'EU%';13. Число как строка через TO_CHAR
SELECT order_id
FROM orders
WHERE TO_CHAR(amount,'FM9999990.00') LIKE '%.00';14. Дата в формате ‘YYYY-MM’
SELECT order_id, order_date
FROM orders
WHERE TO_CHAR(order_date,'YYYY-MM') LIKE '2025-09%';15. Фильтр по каталогу ‘/docs/’
SELECT *
FROM pages
WHERE url LIKE '/docs/%';16. Маска задачи в расписании
SELECT job_id
FROM jobs
WHERE job_name LIKE 'ETL_%_DAILY';17. Условие в JOIN (по началу текста)
SELECT o.order_id, s.shipment_id
FROM orders o
JOIN shipments s
ON s.tracking_no LIKE o.order_no || '%';18. Экранирование пользовательского ввода
SELECT *
FROM t
WHERE UPPER(col) LIKE UPPER(
'%' || REPLACE(REPLACE(REPLACE(:q,'\','\\'),'_','\_'),'%','\%') || '%'
) ESCAPE '\';19. Эквивалент ‘%…%’ через INSTR
SELECT *
FROM messages
WHERE INSTR(LOWER(text), LOWER(:q)) > 0;20. Эквивалент ‘prefix%’ через SUBSTR
SELECT *
FROM catalog
WHERE SUBSTR(code,1,LENGTH(:p)) = :p;Еще 20 примеров.
21. Функциональный индекс для UPPER(col)
CREATE INDEX idx_users_name_u ON users(UPPER(name));22. Поиск с использованием индекса (UPPER)
SELECT *
FROM users
WHERE UPPER(name) LIKE UPPER('AL%');23. Выявляем ведущий пробел
SELECT *
FROM data
WHERE value LIKE ' %';24. Формат артикулов ‘AB-____’
SELECT sku
FROM items
WHERE sku LIKE 'AB-____';25. Телефоны, начинающиеся с ‘+7’
SELECT phone
FROM contacts
WHERE phone LIKE '+7%';26. Удаляем ведущие/хвостовые ‘/’ и фильтруем
SELECT *
FROM t
WHERE TRIM(BOTH '/' FROM path) LIKE 'api/%';27. CASE для маркировки совпадений
SELECT id,
CASE WHEN name LIKE '%test%' THEN 1 ELSE 0 END AS is_test
FROM t;28. Сортировка результата (ORDER BY)
SELECT name
FROM people
WHERE name LIKE 'M%'
ORDER BY name;29. Ограничение результата (FETCH)
SELECT *
FROM logs
WHERE message LIKE '%error%'
ORDER BY ts DESC
FETCH FIRST 100 ROWS ONLY;30. NULL‑безопасность через NVL
SELECT id
FROM t
WHERE NVL(comment,'') LIKE '%ok%';31. UPDATE с условием по маске
UPDATE users
SET segment = 'legacy'
WHERE email LIKE '%@oldmail.%';32. DELETE с условием по маске
DELETE FROM cache
WHERE key LIKE 'tmp:%';33. MERGE с фильтром в источнике
MERGE INTO tgt t
USING (SELECT * FROM src WHERE code LIKE 'X%') s
ON (t.id = s.id)
WHEN MATCHED THEN UPDATE SET t.val = s.val
WHEN NOT MATCHED THEN INSERT (id,val) VALUES (s.id,s.val);34. VIEW с преднастроенной маской
CREATE OR REPLACE VIEW v_docs AS
SELECT *
FROM documents
WHERE path LIKE '/docs/%';35. EXISTS + маска в подтаблице
SELECT *
FROM orders o
WHERE EXISTS (
SELECT 1 FROM notes n
WHERE n.order_id = o.order_id
AND n.text LIKE '%urgent%'
);36. Несколько TLD по OR
SELECT email
FROM users
WHERE email LIKE '%.ru'
OR email LIKE '%.ua'
OR email LIKE '%.kz';37. Фиксированная длина через ‘_’
SELECT code
FROM dict
WHERE code LIKE 'AB____';38. Поиск одним параметром в нескольких колонках
SELECT *
FROM clients
WHERE UPPER(name) LIKE UPPER('%' || :q || '%')
OR UPPER(email) LIKE UPPER('%' || :q || '%');39. CI‑поиск через NLS настройки
ALTER SESSION SET NLS_COMP=LINGUISTIC;
ALTER SESSION SET NLS_SORT=BINARY_CI;
SELECT * FROM cities WHERE city_name LIKE 'алматы%';40. REGEXP_LIKE для сложных шаблонов
SELECT *
FROM phones
WHERE REGEXP_LIKE(number, '^\+7\d{10}$');Еще 20 примеров.
41. Диапазон дат + текстовая маска
SELECT *
FROM orders
WHERE order_date >= DATE '2025-09-01'
AND order_date < DATE '2025-10-01'
AND comment LIKE '%gift%';42. Артисты, начинающиеся на ‘The ‘
SELECT *
FROM music
WHERE artist LIKE 'The %';43. Точный путь без поддерева
SELECT *
FROM files
WHERE path LIKE '/README.md';44. Экранируем пользовательский ‘_’ (ESCAPE)
SELECT *
FROM tags
WHERE tag LIKE REPLACE(:tag,'_','\_') ESCAPE '\';45. Конкатенация для ‘%…%’
SELECT *
FROM messages
WHERE text LIKE '%' || :needle || '%';46. Комбинируем несколько масок через AND
SELECT *
FROM urls
WHERE url LIKE 'https://%'
AND url LIKE '%/docs/%';47. Отрицание двух масок (NOT)
SELECT *
FROM dict
WHERE term NOT LIKE '% %'
AND term NOT LIKE '%-%';48. Автодополнение городов
SELECT DISTINCT city_name
FROM cities
WHERE UPPER(city_name) LIKE UPPER(:prefix || '%')
ORDER BY city_name
FETCH FIRST 20 ROWS ONLY;49. Фильтр по длине и префиксу
SELECT username
FROM users
WHERE username LIKE 'a%'
AND LENGTH(username) BETWEEN 3 AND 12;SELECT *
FROM t
WHERE TRIM(NVL(comment,'')) LIKE '%ok%';51. Номерной ряд ‘INV-2025-‘
SELECT invoice_no
FROM invoices
WHERE invoice_no LIKE 'INV-2025-%';52. Локальные IP‑адреса
SELECT ip
FROM hosts
WHERE ip LIKE '192.168.%';53. Маска UUID‑подобной строки
SELECT id
FROM items
WHERE id LIKE '________-____-____-____-____________';54. Отбор по расширениям
SELECT filename
FROM files
WHERE filename LIKE '%.pdf'
OR filename LIKE '%.docx';55. Сегмент URL с ‘_’
SELECT url
FROM logs
WHERE url LIKE '%/_/%';56. Удаление хвоста по маске (UPDATE)
UPDATE products
SET name = SUBSTR(name,1,INSTR(name,' (old)')-1)
WHERE name LIKE '% (old)';57. NVARCHAR2 — мультиязычный поиск
SELECT title
FROM books
WHERE title LIKE :q;58. UPPER + LIKE после индекса
-- см. создание индекса выше
SELECT *
FROM users
WHERE UPPER(name) LIKE 'IVAN%';59. ESCAPE с символом ‘#’
SELECT raw_text
FROM t
WHERE raw_text LIKE 'A#_B#%#_' ESCAPE '#';60. Строки даты ‘DD.MM.YYYY’
SELECT dstr
FROM strs
WHERE dstr LIKE '__.__.____';Еще 20 примеров.
61. Маска для PAN с пробелами
SELECT masked_pan
FROM payments
WHERE masked_pan LIKE '____ ____ ____ ____';62. IN + подзапрос с маской
SELECT *
FROM orders
WHERE customer_id IN (
SELECT customer_id FROM customers WHERE email LIKE '%.edu'
);63. Коды страны в телефонах
SELECT phone
FROM contacts
WHERE phone LIKE '+44%';64. Группировка провайдеров по маске
SELECT
CASE
WHEN email LIKE '%@gmail.com' THEN 'gmail'
WHEN email LIKE '%@yahoo.com' THEN 'yahoo'
ELSE 'other'
END AS provider,
COUNT(*) AS cnt
FROM users
GROUP BY
CASE
WHEN email LIKE '%@gmail.com' THEN 'gmail'
WHEN email LIKE '%@yahoo.com' THEN 'yahoo'
ELSE 'other'
END;65. CHECK‑ограничение с маской
ALTER TABLE users ADD CONSTRAINT chk_username
CHECK (username LIKE 'usr_%');66. Экранирование обратной косой
SELECT *
FROM t
WHERE col LIKE '%\\%' ESCAPE '\';67. Сравнение с пустой строкой (NVL)
SELECT *
FROM t
WHERE NVL(col,'') LIKE '';68. Расширения без учёта регистра
SELECT filename
FROM files
WHERE UPPER(filename) LIKE '%.PNG';69. Поиск по якорю в URL
SELECT *
FROM docs
WHERE url LIKE '%#section-%';70. Маска ‘ABC-___’ для SKU
SELECT sku
FROM items
WHERE sku LIKE 'ABC-___';71. План запроса с LIKE
EXPLAIN PLAN FOR
SELECT /* like test */ * FROM big_t WHERE col LIKE 'X%';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());72. YEAR через TO_CHAR
SELECT *
FROM sales
WHERE TO_CHAR(sale_date,'YYYY') LIKE '2025';73. Автокомплит для товаров
SELECT DISTINCT product_name
FROM products
WHERE product_name LIKE :p || '%'
ORDER BY product_name
FETCH FIRST 15 ROWS ONLY;74. Верхний уровень по коду ‘TOP-%’
SELECT category_id, code
FROM categories
WHERE code LIKE 'TOP-%';75. IBAN по стране ‘DE’
SELECT iban
FROM payments
WHERE iban LIKE 'DE%';76. URL по протоколу http/https
SELECT url
FROM urls
WHERE url LIKE 'http://%'
OR url LIKE 'https://%';77. DELETE с EXISTS и маской
DELETE FROM logs l
WHERE EXISTS (
SELECT 1 FROM users u
WHERE u.user_id = l.user_id
AND u.email LIKE '%@example.com'
);78. UPDATE с CASE по ключевому слову
UPDATE orders
SET priority = CASE WHEN comment LIKE '%urgent%' THEN 'HIGH' ELSE 'NORMAL' END;79. Индекс на LOWER(city_name)
CREATE INDEX idx_lower_city ON cities(LOWER(city_name));80. LOWER + LIKE после индекса
SELECT *
FROM cities
WHERE LOWER(city_name) LIKE LOWER(:q || '%');Еще 20 примеров.
81. Имя с апострофом
SELECT name
FROM people
WHERE name LIKE '%''%';82. Поддомены корпоративного домена
SELECT email
FROM users
WHERE email LIKE '%@%.example.com';83. API‑путь ‘/api/v1/%’
SELECT *
FROM access_log
WHERE path LIKE '/api/v1/%';84. Вложенный подзапрос и ORDER BY
SELECT *
FROM (
SELECT * FROM items WHERE name LIKE :q || '%'
)
ORDER BY name;85. Пересечение префикса и суффикса
SELECT *
FROM t
WHERE col LIKE 'AB%'
AND col LIKE '%Z';86. Исключение временных и устаревших
SELECT *
FROM t
WHERE col NOT LIKE 'TMP%'
AND col NOT LIKE '%-OLD';87. HEX‑хеши на заданный префикс
SELECT hash_hex
FROM blobs
WHERE hash_hex LIKE 'DEADBEEF%';88. Коды аэропортов типа ‘RU-_’
SELECT code
FROM airports
WHERE code LIKE 'RU-_';89. Экранируем шаблон пользователя (ESCAPE ‘#’)
SELECT *
FROM t
WHERE col LIKE REPLACE(REPLACE(REPLACE(:p,'#','##'),'_','#_'),'%','#%')
ESCAPE '#';90. Префиксный фильтр по имени
SELECT customer_id, name
FROM customers
WHERE name LIKE 'A%';91. Суффикс домена в почте
SELECT email
FROM users
WHERE email LIKE '%@gmail.com';92. Поиск подстроки в описании
SELECT product_id, description
FROM products
WHERE description LIKE '%eco%';93. Использование ‘_’ для одного символа
SELECT code
FROM promo
WHERE code LIKE 'A_C';94. Ищем буквальный символ ‘%’ (ESCAPE)
SELECT note
FROM notes
WHERE note LIKE '10\%%' ESCAPE '\';95. Ищем буквальный ‘_’
SELECT path
FROM files
WHERE path LIKE 'A\_B%' ESCAPE '\';96. Регистронезависимость через UPPER
SELECT *
FROM cities
WHERE UPPER(city_name) LIKE UPPER(:p || '%');97. TRIM и шаблон с префиксом
SELECT *
FROM contacts
WHERE TRIM(name) LIKE 'Mr %';98. Маска кириллицей (начало строки)
SELECT person_id, full_name
FROM people
WHERE full_name LIKE 'Ан%';99. Исключаем нежелательные расширения (NOT)
SELECT url
FROM hits
WHERE url NOT LIKE '%.png';100. Несколько масок через OR
SELECT *
FROM orders
WHERE status LIKE 'NEW%'
OR status LIKE 'PEND%';Частые ошибки и подводные камни
- Лидирующий «%». Шаблон вида
'%abc'обычно не использует индекс по колонке — подумайте о перестройке данных или функц‑индексах. - Регистрозависимость. По умолчанию сравнение зависит от регистра/NLS; добавляйте
UPPER/LOWERили настройте языковую сортировку сеанса. - Экранирование. Для поиска буквальных
%и_применяйтеESCAPE. - Типы. Явно приводите даты/числа к строке через
TO_CHAR. - NULL. При
col IS NULLвыражение возвращает UNKNOWN — используйтеNVL(col,'')при необходимости.
Альтернативы
REGEXP_LIKE— полные регулярные выражения для сложных шаблонов.INSTR— поиск подстроки (%...%≈INSTR(...) > 0).SUBSTR— префиксные проверки без шаблонов.
Заключение
LIKE — лаконичный инструмент поиска по простым шаблонам. Добивайтесь устойчивой скорости с помощью функциональных индексов, экранируйте спецсимволы и переходите на REGEXP_LIKE при усложнении правил.
Документация
Oracle SQL Language Reference — Conditions (LIKE)
🔜 Следующая статья:
IS в Oracle SQL — как сравнивать и проверять NULL