【问题标题】:Match against multiple LIKE patterns that come from another query匹配来自另一个查询的多个 LIKE 模式
【发布时间】:2016-03-30 09:21:56
【问题描述】:

我有一个带有我感兴趣的后缀 (TLD) 的表。例如,它包含以下内容:

'.co.uk'
'.de'
'.fr'

我还有另一个带有 URL 的表。基于第一个表,我想从第二个表中检索与任何模式匹配的所有记录:

'%.co.uk/%.asp'
'%.de/%.asp'
'%.fr/%.asp'

这种情况下的一般模式是'%.<TLD>/%.asp'

我该怎么做?现在我正在使用一个临时程序,它根据第一个表生成一系列 OR,然后运行生成的查询。我对此不满意,因为生成的查询非常庞大,并且每次 TLD 表更改时都必须重新运行程序。

【问题讨论】:

  • 我是否理解正确:您想过滤所有适合您的任何 TLD 或 %.asp 的 URL?
  • 不,斜杠是 url 中的分隔符,所以我正在寻找类似 @​​987654325@ 的结果。
  • 啊,好的……动态SQL可以吗?
  • 您好,反对者!没有评论就不应该投反对票...

标签: sql tsql pattern-matching sql-like


【解决方案1】:

这样的?

它还会生成 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

【讨论】:

  • 很好,这就是诀窍!超过 150 个 tld 速度很慢,但这对我来说不是问题。
  • @Emmit 很高兴看到这篇文章!您是否尝试分两步进行过滤:WHERE RIGHT(URL,4)='.asp' AND( ... or list ...)?在这种情况下,您将 OR 列表构建到 /% ...
猜你喜欢
  • 2016-01-14
  • 2020-02-19
  • 2012-04-24
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-30
相关资源
最近更新 更多