PATINDEX出现意外结果

时间:2018-12-13 16:28:28

标签: sql sql-server replace pattern-matching matching

我正在使用PATINDEX进行一些字符串处理,以修复XML中的一些错误时间格式,例如(2018-12-20T17:00:00-05:00)。

我遇到的问题是PATINDEX,它正在@IncorrectMatchIndex字符串中找到与@Pattern的匹配项。

您可以通过运行以下命令来重新创建问题:

DECLARE @Pattern nvarchar(36) = '%<EstmatedTime>%T%-%</EstmatedTime>%',
        @CorrectMatchIndex nvarchar(100) = '<DiscountedRate>263.34</DiscountedRate><EstmatedTime>2018-12-20T17:00:00-05:00</EstmatedTime></Rate>',
        @CorrectMatchIndex2 nvarchar(94) = '<DiscountedRate>263.34</DiscountedRate><EstmatedTime>2018-12-20T17:00:00</EstmatedTime></Rate>',
        @IncorrectMatchIndex nvarchar(296) = '<DiscountedRate>263.34</DiscountedRate><EstmatedTime>2018-12-20T17:00:00</EstmatedTime></Rate><Rate><Carrier>FedEx Freight</Carrier><Service>FEDEX_FREIGHT_PRIORITY</Service><PublishedRate>520.6</PublishedRate><DiscountedRate>272.04</DiscountedRate><EstmatedTime>2018-12-18T17:00:00</EstmatedTime>'

SELECT
  PATINDEX(@Pattern, @CorrectMatchIndex) AS CorrectMatchIndex,
  PATINDEX(@Pattern, @CorrectMatchIndex2) AS CorrectMatchIndex2,
  PATINDEX(@Pattern, @IncorrectMatchIndex) AS IncorrectMatchIndex

2 个答案:

答案 0 :(得分:1)

  

据我所知,@ IncorrectMatchIndex字符串不包含与%<EstmatedTime>%T%-%</EstmatedTime>%的匹配项。 T和结束</EstmatedTime>

之间没有破折号

是的。因为在字符串的后面有第二组<EstimatedTime>标记,并且在 first T last <之间肯定有一个'-'字符。 / em> </EstimatedTime>

答案 1 :(得分:1)

仅凭猜测,我怀疑您想要:

DECLARE @Pattern nvarchar(300) = '%<EstmatedTime>[1-2][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]-[0-9][0-9]:[0-9][0-9]</EstmatedTime>%'

然后返回0的{​​{1}}。

当然,注释是正确的,您实际上应该使用XQUERY。但是,我无法为此提供示例,因为您没有提供有效XML的XML数据(例如IncorrectMatchIndex@CorrectMatchIndex结尾,但从未打开该节点)。