T-SQL模式匹配问题

时间:2011-07-07 21:28:33

标签: tsql pattern-matching

我需要确定给定字符串的格式是否为'abcd efg -4',即'%-number'。我需要隔离'4',并将其增加到'5'。

字符串的其余部分可以包含日期和时间,如下所示:

  

abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM

例如,

这个字符串不满足模式,即 - [数字]。对于此字符串,我的SQL输出应为

  

abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -1

如果输入上述内容,我应该:

  

abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -2

数字可以是任意数量的数字,即字符串可以是'abcd efg -123',而我的T-SQL将返回'abcd efg -124'

此T-SQL代码将嵌入存储过程中。我知道我可以实现.Net存储过程/函数并使用Regex来执行此操作,但是为了在SQL Server上打开CLR,我必须解决各种访问问题。

我尝试过以下模式:

  • '%[] [ - ]%[0-9]',这适用于大多数情况,但在某个地方放入一个额外的空间而且失败
  • '%[] [ - ]%[^ az] [^ AZ]%[0-9]',设法跳过'-4'(如上例所示),但在多种情况下有效,这样
  • '%[] [ - ] [^ a-z] [^ A-Z]%[0-9]',这在某些情况下再次起作用,在其他情况下不适用......

此模式' - [number]'将始终位于字符串的末尾,如果它不存在,则代码会附加它,如上例所示。

我想要一个适用于所有情况的模式......

1 个答案:

答案 0 :(得分:0)

有趣的问题。你确实意识到这比实际需要的要困难得多。如果您正确地规范了表格,使每列只包含一条信息,那么根本就没有问题。如果有可能,我强烈建议您考虑将这些数据标准化。

如果你无法规范化数据,那么我会向后看。您说您要查找的破折号始终显示在数据的末尾。为什么不反转字符串,解析它,然后将它重新组合在一起。通过反转字符串,您将寻找'[0-9]%[ - ]',这更容易找到。

我将测试数据放入表变量中,以便我可以测试我提出的代码。您可以将其复制/粘贴到查询窗口以查看其工作原理。

Declare @Temp Table(Data VarChar(100))

Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM')
Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -1')
Insert Into @Temp Values('abcd efg - ghis asdjh - 07-07-2011 05-30-34 AM -2')
Insert Into @Temp Values('abcd efg -123')

Select Case When PatIndex('[0-9]%[-]%', Reverse(Data)) = 1
            Then Left(Data, Len(Data)-CharIndex('-', Reverse(Data))) + '-' +
                 Convert(VarChar(20), 1+Convert(Int, Reverse(Left(Reverse(Data), CharIndex('-', Reverse(Data))-1))))
            Else Data + ' -1'
            End
From   @Temp