Что эквивалентно regexp_replace в SQL Server - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть этот фрагмент кода в Oracle, который мне нужно преобразовать в SQL Сервер, чтобы получить такое же поведение. Я использовал функцию REPLACE. Кажется, это работает, но я просто хотел убедиться.

REGEXP_REPLACE(
                phonenumber, 
               '([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{4})', 
               '(\1)\2-\3'
               ) phonenumber

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

SQL Сервер не имеет встроенной поддержки регулярных выражений. Вам нужно будет использовать CLR (или как @ Lukasz Szozda указывает в комментариях одно из более новых Language Extensions ).

Если я правильно понял регулярное выражение хотя он сопоставляет строки из 10 цифр и назначает первые 3 группе 1, вторые 3 группе 2 и последние 4 группе 3, а затем использует обратные ссылки в выражении (\1)\2-\3

Вы можете использовать встроенный в строковых функциях сделать это, как показано ниже

SELECT CASE
         WHEN phonenumber LIKE REPLICATE('[0-9]', 10)
           THEN  FORMATMESSAGE('(%s)%s-%s', 
                      LEFT(phonenumber, 3),
                      SUBSTRING(phonenumber, 4, 3),
                      RIGHT(phonenumber, 4))
         ELSE phonenumber
       END
0 голосов
/ 28 апреля 2020

Вы можете написать SQL функцию, используя CLR, которая будет переносить стандартное do tnet regex. Я написал это, и вы можете использовать его там . Это будет выглядеть так:

DECLARE @SourceText NVARCHAR(MAX) = N'My first line <br /> My second line';
DECLARE @RegexPattern NVARCHAR(MAX) = N'([<]br\s*/[>])';
DECLARE @Replacement NVARCHAR(MAX) = N''
DECLARE @IsCaseSensitive BIT = 0;

SELECT regex.Replace(@SourceText, @RegexPattern, @Replacement, @IsCaseSensitive);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...