如何patindex
在表格或变量中找到所有位置?
declare @name nvarchar(max)
set @name ='ali reza dar yek shabe barani ba yek '
+ 'dokhtare khoshkel be disco raft va ali baraye'
+ ' 1 saat anja bud va sepas... ali...'
select patindex('%ali%',@name) as pos
这会返回1
,但我想要所有结果,例如:
pos
===
1
74
113
我认为这将比您选择的循环方法更有效(这里有一些证据),并且肯定比递归 CTE 更有效:
示例用法:
结果:
如果您的字符串长度超过 2K,则使用 sys.all_columns 而不是 sys.all_objects。如果超过 8K,则添加交叉连接。
为了使其可重用,您可以在表函数中使用它来调用它,如下所示:
该功能可能如下所示
--递归CTE
我喜欢 Aaron Bertrand 的回答。虽然没完全看懂,但是看起来真的很优雅。
过去我在使用
sys.objects
. 结合我对代码进行故障排除的需要,我提出了 Aaron 代码的变体,并在下面添加了它。这是我的程序:
该
MAX(posid)
值也是找到的匹配数。这是一个基于Aaron 回答的简单代码:
代码:
结果
抱歉,这么晚了,但我想让那些想要扩展它的人更容易。我查看了这些实现中的每一个,选择了对我来说最好的一个(Aaron Bertrand),简化了它,然后你就得到了“模板”。明智地使用它。
作为参考 - 您可以从中派生其他行为,例如扩展 PATINDEX():