替换 SQL 服务器中的函数

Replace function in SQL Server

我有一串数据

'["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,,)

这是我正在使用的示例代码

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

您可以尝试以下方法:

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

如果您执行两次相同的替换,将处理任意数量的连续逗号。

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

第一个REPLACE处理所有奇数位置...

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

再做一遍会处理剩下的全部

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


请注意,通过专门处理三个连续逗号的特殊情况 (如此处的其他答案),您将不会处理四个或五个或六个等。以上解决方案概括为任意长度的连续逗号。

为了完全稳健,您可能还需要考虑字符串中第一个或最后一个位置何时缺少 NULL

[,ThatOneToMyLeft,and,ThatOneToMyRight,]

一种费力但稳健的方法可能是分别用 [,,,,] 替换 [,,],然后进行双重替换,然后撤消第一个步骤...

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

有一些方法可以使它变得不那么冗长,但我现在必须运行:)

您可以创建一个与字符串替换函数关联的函数来解决您的问题。

检查这个:

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;