我尝试使用patindex()函数,我在-
字符匹配。
select PATINDEX('-', table1.col1 )
from table1
问题是它总是返回0。
以下也没有用:
PATINDEX('\-', table1.col1 )
from table1
PATINDEX('/-', table1.col1 )
from table1
答案 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
它似乎有效,但我不明白为什么。