匹配来自另一个查询的多个 LIKE 模式
Match against multiple LIKE patterns that come from another query
我有一个 table 我感兴趣的后缀 (TLD)。例如,它包含:
'.co.uk'
'.de'
'.fr'
我还有另一个 table 有 URL。基于第一个 table,我想从第二个 table 中检索与任何模式匹配的所有记录:
'%.co.uk/%.asp'
'%.de/%.asp'
'%.fr/%.asp'
这种情况下的一般模式是 '%.<TLD>/%.asp'
。
我该怎么做?现在我正在使用一个临时程序,它根据第一个 table 和我 运行 生成的查询生成一系列 OR。我对此不满意,因为生成的查询非常庞大,每次 TLD table 更改时都必须重新 运行 程序。
是这样的吗?
它还会生成 OR 列表,但它是动态执行的,因此在更改 TLD 列表后不需要外部生成和重新生成。您可能会考虑 RegEx,但您的列表也很长。
一个增强可能是使用第一个过滤器来获取所有以 .asp
结尾的记录(快速 RIGHT
4 个字符),然后仅对您的 TLD 进行模式搜索...
CREATE TABLE #TLDs(TLD VARCHAR(10));
INSERT INTO #TLDs VALUES('.co.uk'),('.de'),('.fr');
CREATE TABLE #URLs(URL VARCHAR(200));
INSERT INTO #URLs VALUES
('http://www.test1.de')
,('http://www.test2.de/login.asp')
,('http://www.test3.fr/login.other')
,('http://www.test4.co.uk/login.asp')
,('http://www.test5.com')
,('http://www.test6.tv')
,('http://www.test7.asp/login.asp');
DECLARE @filter VARCHAR(MAX)=
STUFF
(
(
SELECT 'OR URL LIKE ''%' + TLD + '/%.asp'' '
FROM #TLDs
FOR XML PATH('')
),1,3,''
)
DECLARE @cmd VARCHAR(MAX)=
'SELECT * FROM #URLs AS u WHERE ' + @filter;
EXEC (@cmd);
DROP TABLE #URLs;
DROP TABLE #TLDs;
结果
http://www.test2.de/login.asp
http://www.test4.co.uk/login.asp
我有一个 table 我感兴趣的后缀 (TLD)。例如,它包含:
'.co.uk'
'.de'
'.fr'
我还有另一个 table 有 URL。基于第一个 table,我想从第二个 table 中检索与任何模式匹配的所有记录:
'%.co.uk/%.asp'
'%.de/%.asp'
'%.fr/%.asp'
这种情况下的一般模式是 '%.<TLD>/%.asp'
。
我该怎么做?现在我正在使用一个临时程序,它根据第一个 table 和我 运行 生成的查询生成一系列 OR。我对此不满意,因为生成的查询非常庞大,每次 TLD table 更改时都必须重新 运行 程序。
是这样的吗?
它还会生成 OR 列表,但它是动态执行的,因此在更改 TLD 列表后不需要外部生成和重新生成。您可能会考虑 RegEx,但您的列表也很长。
一个增强可能是使用第一个过滤器来获取所有以 .asp
结尾的记录(快速 RIGHT
4 个字符),然后仅对您的 TLD 进行模式搜索...
CREATE TABLE #TLDs(TLD VARCHAR(10));
INSERT INTO #TLDs VALUES('.co.uk'),('.de'),('.fr');
CREATE TABLE #URLs(URL VARCHAR(200));
INSERT INTO #URLs VALUES
('http://www.test1.de')
,('http://www.test2.de/login.asp')
,('http://www.test3.fr/login.other')
,('http://www.test4.co.uk/login.asp')
,('http://www.test5.com')
,('http://www.test6.tv')
,('http://www.test7.asp/login.asp');
DECLARE @filter VARCHAR(MAX)=
STUFF
(
(
SELECT 'OR URL LIKE ''%' + TLD + '/%.asp'' '
FROM #TLDs
FOR XML PATH('')
),1,3,''
)
DECLARE @cmd VARCHAR(MAX)=
'SELECT * FROM #URLs AS u WHERE ' + @filter;
EXEC (@cmd);
DROP TABLE #URLs;
DROP TABLE #TLDs;
结果
http://www.test2.de/login.asp
http://www.test4.co.uk/login.asp