替换 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;
我有一串数据
'["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;