【问题标题】:Replace function in SQL ServerSQL Server 中的替换函数
【发布时间】:2020-07-04 04:47:19
【问题描述】:

我有一串数据

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

【问题讨论】:

  • 大概,该代码是updateselect 的一部分,所以它实际上做了一些事情。
  • 对于您给出的示例,代码有效:DB<>Fiddle
  • @GordonLinoff 是的,它将成为更新声明的一部分。
  • @Larnu 我面临的问题是连续丢失数据的三个逗号。 ',,,' 我最终得到 ,NULL,,

标签: sql sql-server tsql replace sql-function


【解决方案1】:

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

检查一下:

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;

【讨论】:

    【解决方案2】:

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

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

    有一些方法可以减少冗长,但我现在必须运行:)

    【讨论】:

    • DECLARE @text varchar(max) = '["Dog",,]' 可能是一个边缘案例,但这是一个好方法。 +1
    • @Zhorov - 我真的很沮丧,因为我没有处理这个问题。自从我不得不在 SQL 中处理逗号分隔的字符串以来已经有很长时间了,但即使没有包围方括号,解决方案也是一样的......
    • 这太棒了。你是如何理解第一次替换的奇怪位置的? @MatBailie
    【解决方案3】:

    您可以尝试以下方法:

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

    【讨论】:

    • 内部替换只需要与外部替换相同。毕竟,内部会将,,, 变成,NULL,,,然后外部将完成这项工作。像这样嵌套它也意味着将处理任何长度的,,,,,,,(',,,,,' => ,NULL,,NULL,,' => ',NULL,NULL,NULL,NULL,')
    • (两个替换都应该在 ,, 上以获得最大收益。您不需要处理三个或更多连续逗号的特殊情况。按照 OP 执行一次即可处理所有奇数次,第 1 次,第 3 次等。以完全相同的方式再次执行,将处理所有剩余的事件。)
    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2020-05-13
    • 2021-04-28
    • 2016-07-11
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多