Шаблон строки заменяет столбец - PullRequest
0 голосов
/ 14 ноября 2011

Поскольку выполнять регулярные выражения в SQL не так просто, мне понадобится несколько советов, как решить эту проблему.

У меня есть столбец со следующими типами данных:

Lorem ipsum dolor sit $% foo ## amet% $ , посвященный адептированию elit Nullam odio risus, mollis a interdum vitae, rutrum id leo. Pellentesque dapibus lobortis mattis. Пресент в Nisi A Orci Commodo Scelerisque $% bar ##% $ eget id dui. Morbi Est Arcu, Ultricies и следствие переменного тока, pretium sed mi. Quisque iaculis pretium congue. Etiam Ullamcorper Sapien eu mauris tristique at venenatis mauris ultricies. Proin eu vehicleula enim. Vestibulum aliquam, mauris ac tempus vulputate, odio mauris rhoncus purus, id suscipit Velit Erat Quis Magna.

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

Значение:

  • $%foo##amet%$ становится amet
  • $%bar##%$ становится пустой строкой.

Шаблон в качестве регулярного выражения будет выглядеть примерно так: \$%[^#]+?##([^%]*?)%\$

Хотя я не могу это использовать, поскольку регулярные выражения в tsql не поддерживаются ...

Какой совет?

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Наилучший вариант, который у вас есть, это использовать вложенный REPLACE с фиксированной строкой соответствия:

SELECT REPLACE(
           REPLACE(YourColumn, '$[%]foo##amet[%]$', 'amet'), '$[%]bar##[%]$', '')

Конечно, это не имеет гибкости регулярных выражений ....

Или вы можете создать библиотеку регулярных выражений SQL-CLR (или найти одну из уже существующих ) и включить ее в свой SQL Server - с 2005 года SQL Server может выполнить.NET-код и что-то вроде библиотеки регулярных выражений - прекрасный пример для расширения T-SQL с возможностями .NET.

0 голосов
/ 29 ноября 2011

исправлено с помощью этой функции:

CREATE FUNCTION [dbo].[ReplaceWithDefault]
(
   @InputString VARCHAR(4000)
)
RETURNS VARCHAR(4000)
AS
BEGIN
    DECLARE @Pattern VARCHAR(100) SET @Pattern = '$[%]_%##%[%]$'
    -- working copy of the string
    DECLARE @Result VARCHAR(4000) SET @Result = @InputString
    -- current match of the pattern
    DECLARE @CurMatch VARCHAR(500) SET @curMatch = ''
    -- string to replace the current match
    DECLARE @Replace VARCHAR(500) SET @Replace = ''
    -- start + end of the current match
    DECLARE @Start INT
    DECLARE @End INT
    -- length of current match
    DECLARE @CurLen INT
    -- Length of the total string -- 8001 if @InputString is NULL
    DECLARE @Len INT SET @Len = COALESCE(LEN(@InputString), 8001)

    WHILE (PATINDEX('%' + @Pattern + '%', @Result) != 0) 
    BEGIN
        SET @Replace = ''

        SET @Start = PATINDEX('%' + @Pattern + '%', @Result)
        SET @CurMatch = SUBSTRING(@Result, @Start, @Len)

        SET @End = PATINDEX('%[%]$%', @CurMatch) + 2
        SET @CurMatch = SUBSTRING(@CurMatch, 0, @End)

        SET @CurLen = LEN(@CurMatch)

        SET @Replace = REPLACE(RIGHT(@CurMatch, @CurLen - (PATINDEX('%##%', @CurMatch)+1)), '%$', '')

        SET @Result = REPLACE(@Result, @CurMatch, @Replace)
    END
    RETURN(@Result)
END
0 голосов
/ 14 ноября 2011

Вы должны сделать следующий код:

SELECT REPLACE(REPLACE(YourColumn, ' $%amet%$ ', ' amet '), ' $%bar%$ ', ' ')

Символ% представляет «Любую строку из нуля или более символов», как объяснено здесь .Вы должны поставить пробелы, чтобы идентифицировать только отдельные слова:)

...