Заменить функцию в SQL Server - PullRequest
0 голосов
/ 23 марта 2020

У меня есть строка данных

'["Dog",,,1,"Person","2020-03-17",,4,"Todd]'

Я пытаюсь использовать функцию замены для замены двойных запятых на значения NULL

Решение

'["Dog",NULL,NULL,1,"Person","2020-03-17",NULL,4,"Todd]'

Но Я продолжаю заканчивать с

'"Dog",NULL,,1,"Person","2020-03-17",NULL,4,"Todd'

(,,, должен стать ,NULL,NULL,, но становится ,NULL,,)

Вот мой пример кода I пользуюсь

   REPLACE(FileData, ',,' , ',NULL,')
   WHERE FileData LIKE '%,,%'

Ответы [ 3 ]

3 голосов
/ 23 марта 2020

Если вы сделаете одну и ту же замену дважды, будет обработано любое количество последовательных запятых.

REPLACE(REPLACE(FileData, ',,' , ',NULL,'), ',,' , ',NULL,')

Первая REPLACE имеет дело со всеми нечетными позициями ...

',,,,,,,,'` => ',NULL,,NULL,,NULL,,NULL,'

Повторное действие будет иметь дело с всеми оставшихся позиций.

=> ',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'

Обратите внимание, что специально обрабатывая особый случай трех последовательных запятых (как в другом ответе здесь) вы не будете обрабатывать четыре, пять или шесть и т. Д. c. Вышеупомянутое решение обобщается на любую длину последовательных запятых.

Чтобы быть полностью устойчивыми, вам также может потребоваться учитывать наличие пропущенного NULL в первом или последнем месте в string.

[,ThatOneToMyLeft,and,ThatOneToMyRight,]

Трудоемким, но надежным подходом может быть замена [, и ,] на [,, и ,,] соответственно, затем двойная замена, а затем отмена первых шагов. ..

REPLACE(
  REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            FileData,
            '[,',
            '[,,'
          ),
          ',]',
          ',,]'
        ),
        ',,',
        ',NULL,'
      ),
      ',,',
      ',NULL,'
    ),
    ',]',
    ']',
  ),
  '[,',
  '['
)

Есть способы сделать это менее многословным, но мне нужно бежать прямо сейчас:)

1 голос
/ 23 марта 2020

Вы можете попробовать следующее:

REPLACE(REPLACE(FileData, ',,,' , ',NULL,,'), ',,' , ',NULL,')
   Where FileData LIKE '%,,%'
0 голосов
/ 24 марта 2020

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

Проверьте это:

update table1
set column1 = dbo.ReplaceEx(column1, ',', 'NULL')
where column1 like '%,,%'

create function dbo.ReplaceEx(@string varchar(2000), @separator varchar(4), @nullValue varchar(10))
returns varchar(4000)
with execute as caller
as
begin
    declare @result varchar(4000);
    set @result = '';

    select @result = concat_ws(@sep, @result,
        case when rtrim(value) = '' then @nullValue
        else case when ltrim(rtrim(value)) = '[' then '[' + @nullValue
        else case when ltrim(rtrim(value)) = ']' then @nullValue + ']'
        else value end end end
     )
    from string_split(@string, @separator);

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