匹配来自另一个查询的多个 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