SQL需要在patindex()函数中匹配“-”字符。

3

我正在尝试使用patindex()函数,其中我正在匹配“-”字符。

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

问题是它总是返回0。
以下内容也没有起作用:
PATINDEX('\-', table1.col1 )
from table1
PATINDEX('/-', table1.col1 )
from table1

4个回答

6
在字符类之外的PATINDEXLIKE模式字符串中,-字符没有特殊含义,不需要转义。问题不在于-无法用于精确匹配该字符,而是您正在使用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-。只有当模式在字符类内具有 - 两侧的字符时,它才会被解释为一个范围。

很酷,我从来不知道Pat代表什么。CharIndex()完美地运作。 - user38858
我同意,如果不需要模式匹配,最好使用CharIndex - ErikE
这让我疯了!我试图使用REPLACE(Column, '[_]', ' ')进行更新,但无法弄清为什么它不起作用。正确的应该是REPLACE(Column, '_', ' ') - bonh

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

我在我的项目中使用它,它运行良好。

0

我知道这是一个旧帖子,但在网络世界中找到有用的答案已经证明是徒劳无功的,我想节省其他人的挫败感。
我自己尝试创建一个检查约束来验证电话号码中的字符 - 这是我的模式:

CONSTRAINT Chk_Mobile CHECK (PATINDEX('%[^0-9+() -]%',Mobile) = 0)

基本上,当涉及到破折号时,SQL会将其解释为范围分隔符...
除非你将其放在模式的结尾


0

有趣的是,你提供了一个转义的链接,但并没有进行任何转义... - ErikE
顶级答案(修改后)给了我解决方案,无论它叫什么名字。 - user38858
这个方法有效的原因是你在字符串中添加了%符号。这将它转换为一个模式,而PatIndex正是在寻找这样的模式。在这种情况下,在字符类中放置-字符没有任何效果。 - ErikE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接