Строки, соответствующие любому шаблону

33. Найти строки, подходящие хотя бы под один шаблон

Условие задачи:
Даны две таблицы:

  • t1(str) — содержит строки;

  • t2(mask) — содержит шаблоны для LIKE.

Необходимо выбрать все строки из t1, которые соответствуют хотя бы одному шаблону из t2.


Спойлеры к решению

Подсказки
💡 Сравни строку и шаблон через LIKE.
💡 Для условия «существует хотя бы один подходящий шаблон» удобно использовать EXISTS.
💡 При использовании JOIN одна строка может попасть в результат несколько раз.
💡 В таком случае потребуется DISTINCT.

Решение

Предпочтительный вариант через EXISTS:

SELECT t1.str
FROM t1
WHERE EXISTS (
    SELECT 1
    FROM t2
    WHERE t1.str LIKE t2.mask
);

EXISTS проверяет, существует ли хотя бы один шаблон, которому соответствует текущая строка.

Альтернативный вариант через JOIN:

SELECT DISTINCT t1.str
FROM t1
JOIN t2
    ON t1.str LIKE t2.mask;

DISTINCT нужен, потому что одна строка из t1 может соответствовать нескольким шаблонам из t2.

Для условия «соответствует хотя бы одному шаблону» вариант с EXISTS обычно лучше отражает смысл запроса и не создаёт дубликаты из-за соединения.