【问题标题】:T-SQL Pattern matching issueT-SQL 模式匹配问题
【发布时间】:2011-07-08 07:40:03
【问题描述】:

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

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

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

例如,此字符串不满足模式,即 -[number]。对于这个字符串,我的 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 存储过程/函数并使用正则表达式来执行此操作,但是为了打开 SQL Server 上的 CLR,我必须解决各种访问问题。

我尝试了以下模式:

  • '%[ ][-]%[0-9]',这适用于大多数情况,但在某处放置一个额外的空间,它会失败
  • '%[ ][-]%[^a-z][^A-Z]%[0-9]',这可以跳过'-4'(如上例所示),但在几种情况下有效,这样的
  • '%[ ][-][^a-z][^A-Z]%[0-9]',这在某些情况下再次有效,在其他情况下无效...

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

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

【问题讨论】:

  • 字符串可能看起来像“abcd efg -4 07-07-2011”,在这种情况下,所需的输出是“abcd efg -5 07-07-2011”。但是,字符串也可能看起来像 'abcd efg - 07-07-2011',在这种情况下它应该返回 'abcd efg - 07-07-2011 -1'?我理解正确吗?
  • -[number] 或更准确的模式将是 '-' 将始终位于字符串的末尾...

标签: tsql pattern-matching


【解决方案1】:

有趣的问题。你确实意识到这比它真正需要的要困难得多。如果您正确地规范了您的表格,以便每列仅包含一条信息,那么您根本不会遇到问题。如果可能的话,我强烈建议您考虑对这些数据进行标准化。

如果你不能规范化数据,那么我会倒退。您说您要查找的破折号将始终出现在数据的末尾。为什么不反转字符串,对其进行解析,然后将其重新组合在一起。通过反转字符串,您将找到更容易找到的 '[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

【讨论】:

  • 是的,我意识到这一点。您的解决方案适用于我的大多数情况...谢谢
  • 另外,问题是这个字符串来自应用程序,并且可以在提交给这个数据库之前由用户修改,然后程序......并且这个相同的程序可以被其他程序调用在数据库中。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 2011-06-17
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多