如何在 PATINDEX 中执行 OR

尼尔·P

我想PATINDEX用来匹配列表中的任何项目。如果 patindex 接受 Regex,我想执行以下操作:

select patindex('% for | is| my%','just for stackoverflow')

显然这不起作用并返回 0 不匹配。是否有可以与 LIKE/PATINDEX 一起使用的 Or 语法

加雷斯博士

你可以使用这样的东西。

SELECT t.SearchString, 
        FirstOccurance = MIN(NULLIF(PATINDEX(ss.value, t.SearchString), 0))
FROM (VALUES('just for stackoverflow'), ('no match')) AS t (SearchString)
    CROSS APPLY STRING_SPLIT('%for%|%is%|%my%', '|') AS ss
GROUP BY t.SearchString;

它基本上将所有搜索词作为单个字符串传递,拆分它们并PATINDEX每个词执行一次并返回最低值(不包括被删除的 0 NULLIF

如果您的搜索词不是单个字符串,那么更好的选择可能是将它们放在一个表格中,并使用它执行类似的逻辑,例如

DECLARE @T TABLE (SearchTerm NVARCHAR(MAX))
INSERT @T VALUES ('%for%'), ('%is%'), ('%my%');


SELECT t.SearchString, 
        FirstOccurance = (SELECT TOP 1 PATINDEX(ss.SearchTerm, t.SearchString)
                            FROM @T AS ss
                            WHERE PATINDEX(ss.SearchTerm, t.SearchString) > 0
                            ORDER BY PATINDEX(ss.SearchTerm, t.SearchString))
FROM (VALUES('just for stackoverflow'), ('no match')) AS t (SearchString);

我使用了一种稍微不同的技术(相关子查询中的 TOP 1 而不是CROSS APPLYwith MIN),没有特别的原因,只是为了表明有不止一种方法可以解决它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章