PATINDEX、通配符和变量

PATINDEX, wildcards and variables

如何让 PATINDEX 对包含 % 字符的变量进行通配符匹配?

在下文中我希望 PATINDEX 到 return '%3d' 的起始位置:

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(3)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '%3d'
SET @s = PATINDEX('%' + @cIn +'%', @InputText)

正如您从 @InputText 中看到的那样,它从位置 12 开始。

OEi49j3DNxE %3d

但是 PATINDEX 似乎 return 开始位置为 7,因为它似乎从 CIn:

中删除了 %

OEi49j3DNxE%3d

如何按照指定查找 %3d,而不是 3d

您可以使用方括号:

SET @cIn = '[%]3d'

select 
   without_brackets = patindex('%'+'%3d'+'%','OEi49j3DNxE%3d')
 , with_brackets    = patindex('%'+'[%]3d'+'%','OEi49j3DNxE%3d')

rextester 演示:http://rextester.com/BVA62284

returns:

+------------------+---------------+
| without_brackets | with_brackets |
+------------------+---------------+
|                7 |            12 |
+------------------+---------------+

您必须通过用 [] 换行来转义 % 符号。为了做到这一点,您必须使变量@cIn 更大以容纳额外的 2 个字符,并且只需在执行 patindex 之前进行替换,或者您可以在不更改变量大小的情况下内联执行它。

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(5)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '%3d'
SET @cIn = REPLACE(@cIn, '%', '[%]')
SET @s = PATINDEX('%' + @cIn +'%', @InputText)

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(5)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '%3d'
SET @s = PATINDEX('%' + replace(@cIn, '%', '[%]') +'%', @InputText)

您可以在此处阅读更多信息:How do I escape a percentage sign in T-SQL?

DECLARE @inputText as VARCHAR(100)
DECLARE @s as Int   
DECLARE @cIn as CHAR(3)

SET @inputText = 'OEi49j3DNxE%3d'
SET @cIn = '[%]3d'
SET @s = PATINDEX('%' + @cIn + '%' , @InputText)

select @s

输出:12