【问题标题】:SQL Server, combining % and [] wildcards in LIKE statementSQL Server,在 LIKE 语句中结合 % 和 [] 通配符
【发布时间】:2015-02-18 14:38:47
【问题描述】:

在 t-sql 中,有没有办法在 like 语句中进行模式匹配,以便您可以在给定集合中搜索 1 个或多个字符?

具体来说,我正在尝试提出一个 LIKE 语句,该语句将返回以 1 个或多个字母开头并以 1 个或多个数字结尾的字符串。

所以这些字符串应该匹配:

  • abcd1234
  • a1
  • abcdef2
  • ab123456

而且这些字符串不应该匹配:

  • abcd
  • 1234
  • abcd1234abcd
  • 1abcd1

我知道您可以使用 % 通配符来匹配 0 个或多个字符的字符串,并且您可以使用括号 [] 来匹配给定集中的单个字符。但是有什么方法可以将它们组合起来,以便我可以匹配给定集合中的 1 个或多个字符?

这样的东西会很好,但当然行不通:

WHERE ColumnName LIKE '[%a-z][%0-9]'

有人知道这个问题的解决方案吗?还是在 SQL Server 中不可能?

谢谢, 吉姆

【问题讨论】:

  • 您不需要检查整个内容是字母数字,第一个字符是文本,最后一个字符是数字吗?
  • 不,那行不通,因为我首先想要所有字母字符,然后是数字字符。下面马丁史密斯的评论确实符合我的要求。

标签: sql-server regex sql-like


【解决方案1】:

如果你想使用 Regex 并拥有权限,你可以编写一个用户定义的函数来让自己访问 SQL Server 的 .NET CLR 上的正则表达式解析器:

http://msdn.microsoft.com/en-us/magazine/cc163473.aspx(SQL 2005 及更高版本)

【讨论】:

    【解决方案2】:

    就像模式匹配非常有限,它不允许正常的正则表达式。

    详情请见here

    根据您的需要使用:

    WHERE ColumnName LIKE '[a-z]%[0-9]'
    

    这将匹配任何字母后跟任何内容,然后是数字。 SQL 将强制字母和数字位于字符串的两端,因为在我们的 [] 匹配集之前或之后没有模式或文字字符。

    【讨论】:

    • 是的,我已经意识到没有 CLR 就无法完成。感谢您的建议,但这并不能满足我的需要。它会在不应该匹配的情况下匹配“a1234bcde1”之类的内容。
    • @Jim WHERE ColumnName LIKE '[a-z]%[0-9]' AND ColumnName NOT LIKE '%[0-9][a-z]%'?
    • 是的@Martin,这实际上是我一直在寻找但未能提出的。我想我需要 2 个单独的语句来完成它。谢谢。
    • @Jim - 虽然我想你实际上需要第三个来排除包含既不是字母也不是数字的字符的字符串AND ColumnName NOT LIKE '%[^0-9A-Z]%'
    • 是的@Martin,你也是对的,我打算这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2012-04-18
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多