【问题标题】:Microsoft SQL Server equivalent of MySQL REGEXP相当于 MySQL REGEXP 的 Microsoft SQL Server
【发布时间】:2011-01-31 16:43:49
【问题描述】:

我正在尝试重建我在 Microsoft SQL Server 中为 MySQL 创建的数据库查询。我正在寻找类似于REGEXP 的运算符或函数 SQL Server。

这是我如何使用运算符的示例:

select *
from   musicdetails
WHERE  artistname REGEXP '^".mysql_escape_string($_GET['search'])."$'

【问题讨论】:

    标签: mysql sql-server regex tsql


    【解决方案1】:

    给你(编译为 SQL CLR 程序集):

    using System.Collections;
    using System.Text.RegularExpressions;
    using Microsoft.SqlServer.Server;
    
    public partial class UserDefinedFunctions
    {
      [SqlFunction]
      public static bool RegexMatch(string expr, string regex)
      {
        return Regex.IsMatch(expr, regex);
      }
    
      [SqlFunction]
      public static string RegexReplace(string expr, string regex, string replace)
      {
        return Regex.Replace(expr, regex, replace);
      }
    
      [SqlFunction(FillRowMethodName="GetToken", 
           TableDefinition="Value nvarchar(max)")]
      public static IEnumerable RegexSplit(string expr, string regex)
      {
        return Regex.Split(expr, regex);
      }
    
      public static void GetToken(object row, out string str)
      {
         str = (string) row;
      }
    }
    

    【讨论】:

      【解决方案2】:

      在 SQL Server(仅限 2005 及更高版本)中执行此操作的唯一方法是使用 CLR 函数;作为原生 SQL 查询一部分的正则表达式不是标准的。

      http://msdn.microsoft.com/en-us/magazine/cc163473.aspx

      【讨论】:

        【解决方案3】:

        虽然 leppie 的答案中的代码可以编译和执行,但我不建议将其用于生产用途。如果你想要 RegEx 函数:

        • 使用最佳实践进行编码(针对性能和安全性)
        • 妥善处理NULLs
        • 表现更好/更高效
        • 有更多选项(例如,@StartAt@RegExOptions 用于 IgnoreCaseMultiLine 等)
        • 提供更多功能(例如CaptureGroupCaptureGroupCaptureEscapeUnescape等)
        • 不需要额外的部署工作(即一个独立的、可移植的、可版本控制的 T-SQL 脚本,并且安装干净,无需手动启用“启用 CLR”或弄乱"CLR strict security" setting that was introduced in SQL Server 2017)李>

        而且也是免费的,然后查看SQL# SQLCLR 库(我编写的)。免费版有 13 个正则表达式函数(完整版/付费版还有 2 个,加上增加表达式缓存大小的能力,如果您经常使用各种表达式,这会有所帮助)。

        我相信函数 RegEx_IsMatch(或 RegEx_IsMatch4k)是您正在寻找的(是的,它在免费版本中)。

        【讨论】:

          猜你喜欢
          • 2010-10-25
          • 2011-03-27
          • 2010-09-27
          • 1970-01-01
          • 2011-05-05
          • 1970-01-01
          • 1970-01-01
          • 2011-03-08
          相关资源
          最近更新 更多