2017-05-05 54 views
0

你怎么PATINDEX到做对即包括%字符变量的通配符证相符?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似乎回退R 11在7起始位置,因为它似乎掉落%CIn

OEi49j 3D NXE%3D

我要如何找%3d符合规定,而不是3d

回答

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) 

OR

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?

+0

由于提供的替代选项对我有效(在别的地方使用'cIn',并将其存储为'[%] 3d'会导致其他问题),因此投票回答。谢谢你:) –

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 | 
+------------------+---------------+ 
+0

完全正确的 - 只有@Avitus去为提供的替代工作更好在我的完整代码中。谢谢。 –

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

+0

正确,非常感谢 - 只用@Avitus作为替代提供了更好的工作在我的完整代码。谢谢。 –