Microsoft SQL Server эквивалент MySQL REGEXP - PullRequest
5 голосов
/ 25 марта 2010

Я пытаюсь восстановить запрос к базе данных, созданный для MySQL в Microsoft SQL Server. Я ищу оператор или функцию SQL Server, которая действует как REGEXP.

Вот пример того, как я использую оператор:

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

Ответы [ 3 ]

5 голосов
/ 25 марта 2010

Вот, пожалуйста (скомпилируйте как сборка 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;
  }
}
1 голос
/ 25 марта 2010

Единственный способ сделать это в SQL Server (только 2005 и выше) - использовать функции CLR; регулярные выражения как часть собственных запросов SQL не являются стандартными.

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

0 голосов
/ 22 января 2011

Хотя код в ответе Леппи будет компилироваться и выполняться, я бы не рекомендовал его для производственного использования. Если вы хотите, чтобы функции RegEx:

  • написаны с использованием лучших практик (для производительности и безопасности)
  • ручка NULL с соответственно
  • лучше / эффективнее
  • есть дополнительные параметры (например, @StartAt, @RegExOptions для IgnoreCase , MultiLine и т. Д.)
  • предоставляет больше функциональности (например, CaptureGroup , CaptureGroupCapture , Escape , Unescape и т. Д.)
  • не требует дополнительных усилий для развертывания (т. Е. Отдельный автономный сценарий T-SQL, который переносим и доступен для управления версиями и устанавливается без необходимости вручную включать "CLR enabled" или связываться с "CLR строго безопасности », который был введен в SQL Server 2017 )

и также бесплатны, тогда посмотрите библиотеку SQL # SQLCLR (которую я написал). В бесплатной версии имеется 13 функций RegEx (и еще 2 в полной / платной версии, плюс возможность увеличить размер кэша выражений, что может помочь, если вы часто используете различные выражения).

Я считаю, что функция RegEx_IsMatch (или RegEx_IsMatch4k ) - это то, что вы ищете (да, она есть в бесплатной версии).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...