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
如何让 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