LIKE в Oracle SQL — условие сопоставления по шаблону

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

50. TRIM + NVL перед фильтром

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%';

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

  1. Лидирующий «%». Шаблон вида '%abc' обычно не использует индекс по колонке — подумайте о перестройке данных или функц‑индексах.
  2. Регистрозависимость. По умолчанию сравнение зависит от регистра/NLS; добавляйте UPPER/LOWER или настройте языковую сортировку сеанса.
  3. Экранирование. Для поиска буквальных % и _ применяйте ESCAPE.
  4. Типы. Явно приводите даты/числа к строке через TO_CHAR.
  5. 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


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