Я думаю, вы ищете что-то вроде этого:
DECLARE @stuff TABLE(City VARCHAR(100));
INSERT @stuff (City) VALUES ('Chicago'),('Aurora'),('Winamaic'),('Bloomfield');
SELECT s.city
FROM @stuff AS s
CROSS JOIN (VALUES('%ra'),('Ch%'),('%aic')) AS pattern(pat)
WHERE s.city LIKE pattern.pat;
Возвращает:
city
---------
Chicago
Aurora
Winamaic
Быстрое обновление
Недостатком этого решения является быстрое замедление, если у вас много длинных паттернов. В зависимости от того, что вы делаете, вы можете воспользоваться индексированным представлением. Я делал что-то подобное несколько раз за эти годы с большим успехом. Обратите внимание на мои комментарии:
USE tempdb; -- On your own instance or a Dev box
GO
-- Table DDL and sample data
CREATE TABLE dbo.places
(
CityId INT IDENTITY,
City VARCHAR(100) NOT NULL
);
CREATE TABLE dbo.patterns
(
PatternID INT IDENTITY,
P VARCHAR(100) NOT NULL
);
GO
INSERT dbo.places(City) VALUES ('Chicago'),('Aurora'),('Winamaic'),('Bloomfield');
INSERT dbo.patterns(P) VALUES('%ra'),('Ch%'),('%aic')
GO
-- Indexed View
CREATE VIEW dbo.matchingCities
WITH SCHEMABINDING AS
SELECT places.CityId, places.City
FROM dbo.places
CROSS JOIN dbo.patterns
WHERE PATINDEX(patterns.P,places.City) > 0;
GO
CREATE UNIQUE CLUSTERED INDEX UQ_CL__matchingCities ON dbo.matchingCities(CityId)
GO
-- Query:
SELECT mc.CityId, mc.City
FROM dbo.matchingCities AS mc;
Это возвращает то же самое, но с использованием поиска против моего индексированного представления.