0

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

下面我想PATINDEX返回 '%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似乎在 7 处返回起始位置,因为它似乎放弃了%from CIn

OEi49j 3D NxE%3d

我如何得到%3d指定的查找,而不是3d

4

3 回答 3

2

您可以使用方括号:

SET @cIn = '[%]3d'

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

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

返回:

+------------------+---------------+
| without_brackets | with_brackets |
+------------------+---------------+
|                7 |            12 |
+------------------+---------------+
于 2017-05-05T15:29:00.280 回答
1

您必须通过用 [] 包装来转义 % 符号。为此,您必须使变量 @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)

您可以在此处阅读更多信息:如何在 T-SQL 中转义百分号?

于 2017-05-05T15:32:21.660 回答
1
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

于 2017-05-05T15:45:47.167 回答