为什么使用PATINDEX替换某些特殊字符会失败?

时间:2017-05-15 16:48:07

标签: sql sql-server-2014 patindex

我们尝试使用下面的(简化)命令从字符串中删除某些特殊字符,这是我们在搜索后看到的最常见的解决方案。 但是,使用某些特殊字符时结果不一致。有谁能解释为什么?而且,更好的是,任何人都可以提供有效的解决方案吗?

SQL Server 2014

在下面的第一个案例中,' @'被删除,但在包含它(2 + 5)的所有其他情况下,它不会被删除。对于第三种情况也是如此:空格被删除,但不是'&&#39 ;;在第五种情况下,空格被删除,但不是' @'。其他组合也有类似的问题。

感谢。     声明@str varchar(50)=' 1st Ave @ 1st St FL-3 Rm 323&纽约纽约'

declare @Pindex1  varchar(10) = '%[@]%'
declare @Pindex2  varchar(10) = '%[@& ]%'
declare @Pindex3  varchar(10) = '%[& ]%'
declare @Pindex4  varchar(10) = '%[ ]%'
declare @Pindex5  varchar(10) = '%[@ ]%'

Select @str as String, @Pindex1 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex1,@str), 1), '') as PIndex1_result
Select @str as String, @Pindex2 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex2,@str), 1), '') as PIndex2_result
Select @str as String, @Pindex3 as Pattern ,Replace(@str, Substring(@str, PatIndex(@pindex3,@str), 1), '') as PIndex3_result
Select @str as String, @Pindex4 as Pattern ,Replace(@str, Substring(@str, PatIndex(@Pindex4,@str), 1), '') as PIndex4_result
Select @str as String, @Pindex5 as Pattern,Replace(@str, Substring(@str, PatIndex(@pindex5,@str), 1), '') as PIndex5_result

1 个答案:

答案 0 :(得分:1)

我认为您可能对SQL Server模式有误解。考虑第二种模式:

declare @Pindex2  varchar(10) = '%[@- ]%'

这可以匹配任何模式。为什么? '@'的ASCII值为64,空格为32.这些值之间没有任何关系。它类似于'%[b-a]%',它也不会匹配。

我认为问题在于您对SQL Server字符串模式的理解。