SQL需要匹配patindex()函数中的' - '字符

时间:2014-08-05 00:41:19

标签: sql sql-server

我尝试使用patindex()函数,我在-字符匹配。

select PATINDEX('-', table1.col1 )
from table1

问题是它总是返回0。

以下也没有用:

PATINDEX('\-', table1.col1 )
from table1
PATINDEX('/-', table1.col1 )
from table1

3 个答案:

答案 0 :(得分:5)

字符类之外的-PATINDEX模式字符串中的LIKE字符没有特殊含义,也不需要转义。问题不在于-不能用于字面匹配字符,而是您使用PatIndex而不是CharIndex并且不提供通配符。试试这个:

SELECT CharIndex('-', table1.col1 )
FROM Table1;

如果要匹配模式,则必须使用通配符:

SELECT PatIndex('%-%', table1.col1 )
FROM Table1;

即使在角色类中,如果是第一个或最后一个,破折号也不需要转义:

SELECT PatIndex('%[a-]%', table1.col1 )
FROM Table1;

SELECT PatIndex('%[-a]%', table1.col1 )
FROM Table1;

上述两个内容都会匹配列中任意位置的a-字符。仅当模式在字符类中的-两侧都有字符时才会被解释为范围。

答案 1 :(得分:1)

请确保使用' - '作为通配符中的第一个或最后一个字符,它将起作用。

您甚至可以使用以下功能替换任何特殊字符。

CREATE Function [dbo].[ReplaceSpecialCharacters](@Temp VarChar(200))
Returns VarChar(200)
AS
Begin

    Declare @KeepValues as varchar(200)
    Set @KeepValues = '%[-,~,@,#,$,%,&,*,(,),!,?,.,,,+,\,/,?,`,=,;,:,{,},^,_,|]%'
    While PatIndex(@KeepValues, @Temp) > 0

    SET @Temp =REPLACE(REPLACE(REPLACE( REPLACE (REPLACE(REPLACE( @Temp, SUBSTRING( @Temp, PATINDEX( @KeepValues, @Temp ), 1 ),'')   ,' ',''),Char(10),''),char(13),''),'   ',''), '    ','')

Return REPLACE (RTRIM(LTRIM(@Temp)),' ','')
End

我在我的项目中使用它工作正常

答案 2 :(得分:0)

我在这里找到了另一页的答案。

How to escape underscore character in PATINDEX pattern argument?

select PATINDEX('%[-]%', table1.col1 )
from table1

它似乎有效,但我不明白为什么。