tsql - 如何在 PATINDEX 中执行 OR
问题描述
我想PATINDEX
用来匹配列表中的任何项目。如果 patindex 接受正则表达式,我想做如下的事情:
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 APPLY
with MIN
),没有特别的原因,只是为了表明有不止一种方法可以接近它。
推荐阅读
- c++ - 所有这些错误是关于什么的?
- xaml - 如何创建相机视图 + 按钮以在 Xamarin.Forms 中捕获照片?
- reactjs - useState 在输入字段之外不起作用(基于函数的 Reactjs)
- python - 使用 pandas 导入文件
- c# - 如何使用 asp.net webapi 将图像保存在数据库中
- php - Laravel 7:安装 od FTP 服务器
- python - 向用户显示相关文件 - Django
- kdb - 如何在单个语句中多次查询 kdb 表中的同一列?
- javascript - 尝试使用 tampermonkey 更改跨度元素的数据禁用值
- java - 我不明白关于递归生成子集的那部分代码(java)