我需要确定给定字符串的格式是否为'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,我必须解决各种访问问题。
我尝试过以下模式:
此模式' - [number]'将始终位于字符串的末尾,如果它不存在,则代码会附加它,如上例所示。
我想要一个适用于所有情况的模式......
答案 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