【问题标题】:PATINDEX incorrect result when looking for dash character "-"查找破折号“-”时的 PATINDEX 错误结果
【发布时间】:2018-11-03 01:29:23
【问题描述】:

这个简单的例子显示了我遇到的问题,但我不明白为什么......

我正在测试传递给我的字符串参数中第一个字符的位置,该字符是小写或大写字母、单个破折号或句点。

这两个模式匹配似乎检查相同的东西,但你自己运行这段代码,它会打印一个 0 然后一个 3:

PRINT PATINDEX ( '%[a-z,A-Z,-,.]%', '16-82') 
PRINT PATINDEX ( '%[-,a-z,A-Z,.]%', '16-82') 

我不明白为什么它只有如果破折号是我们检查的第一个字符。

这是一个错误吗?或者按设计工作,但我错过了一些东西......我正在使用 SQL Server 2016,但我认为这并不重要。

【问题讨论】:

    标签: tsql patindex


    【解决方案1】:

    字符组中的破折号可以扮演以下两种角色中的任何一种:

    • 它可能表示破折号本身,就像它在表达式[-abc] 中所做的那样
    • 它可以表示“中间的一切”运算符,就像它在表达式 [a-z] 中所做的那样。

    在您的特定示例中,字符组 [a-z,A-Z,-,.] 表示以下内容:

    • az 的所有内容
    • 逗号,
    • AZ 的所有内容
    • ,, 的所有内容(即再次只是逗号)。
    • .

    其实你可能想写[-a-zA-Z.]

    【讨论】:

    • 很好的解释。所以破折号肯定可以在开始或结束时进行。该语言应该让您对其进行转义,以明确您的意思是角色而不是操作员,IMO。
    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    相关资源
    最近更新 更多