【问题标题】:Regular expressions inside SQL ServerSQL Server 中的正则表达式
【发布时间】:2010-12-30 03:57:20
【问题描述】:

我在我的数据库中存储了类似于5XXXXXX 的值,其中X 可以是任何数字。换句话说,我需要匹配传入的 SQL 查询字符串,例如 5349878

有人知道怎么做吗?

我有不同的情况,例如XXXX7XX,所以它必须是通用的。我不关心在 SQL Server 中以不同的方式表示模式。

我在 .NET 中使用 c#。

【问题讨论】:

    标签: sql sql-server regex expression


    【解决方案1】:

    您可以在 SQL Server 中编写这样的查询:

    --each [0-9] matches a single digit, this would match 5xx
    SELECT * FROM YourTable WHERE SomeField LIKE '5[0-9][0-9]'
    

    【讨论】:

      【解决方案2】:

      SQL 通配符足以达到此目的。请点击此链接:http://www.w3schools.com/SQL/sql_wildcards.asp

      您需要使用这样的查询:

      select * from mytable where msisdn like '%7%'
      

      select * from mytable where msisdn like '56655%'
      

      【讨论】:

      • 感谢回复!这些查询会给我很多不需要的匹配项。 %7% 也将匹配 3373 这对我来说不是一个很好的匹配。 56655% 也将匹配 56655444333 这对我来说也不是一个很好的匹配。查询本身必须使用固定数字。并且数据库本身必须具有模式。有这样的吗?
      • @Jack:是的。您可以使用 len 功能。 select * from mytable where msisdn like '56655%' and len(msisdn) = 10
      【解决方案3】:

      DB 中的存储值为:5XXXXXX [其中 x 可以是任何数字]

      您没有提及数据类型 - 如果是数字,您可能必须使用 CAST/CONVERT 将数据类型更改为 [n]varchar。

      用途:

      WHERE CHARINDEX(column, '5') = 1
        AND CHARINDEX(column, '.') = 0 --to stop decimals if needed
        AND ISNUMERIC(column) = 1
      

      参考资料:

      我也有不同的情况,例如 XXXX7XX,所以它必须是通用的。

      用途:

      WHERE PATINDEX('%7%', column) = 5
        AND CHARINDEX(column, '.') = 0 --to stop decimals if needed
        AND ISNUMERIC(column) = 1
      

      参考资料:

      正则表达式支持

      SQL Server 2000+ 支持正则表达式,但问题是您必须先在 CLR 中创建 UDF 函数,然后才能使用。如果你用谷歌搜索,有很多文章提供了示例代码。完成后,您可以使用:

      • 5\d{6} 第一个例子
      • \d{4}7\d{2} 你的第二个例子

      有关正则表达式的更多信息,我强烈推荐this website

      【讨论】:

      • 我还没有完全检查过,但我看起来是一个很好的答案。我认为你帮了我很多。非常感谢!
      • 一个小细节,IsNumeric 将认为小数点有效,因此 5123.45 的表达式将通过 IsNumeric () 检查,但可能不符合您的标准
      • @Sparky:是的,更新了答案,并在必要时将其排除在外。
      • SQL Server 2005+ 包含 CLR,2000 不包含。
      • 如果模式 %7% 会出现多次或者 PATINDEX 只返回第一次出现,这是否也有效?例如。 X7XX7XXPATINDEX 会不会返回 1 而不是 5?
      【解决方案4】:

      试试这个

      select * from mytable
      where p1 not like '%[^0-9]%' and substring(p1,1,1)='5'
      

      当然,您需要调整子字符串的值,但其余的应该可以工作......

      【讨论】:

        【解决方案5】:

        为了匹配一个数字,你可以使用[0-9]

        所以你可以使用5[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]7[0-9][0-9][0-9]。我经常为邮政编码这样做。

        【讨论】:

          猜你喜欢
          • 2012-11-06
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          • 2013-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多