我正在寻找一种在列上应用任意数量的嵌套REPLACE调用的方法。理想情况下,模式和替换值将来自配置表,例如:
╔═════════╦═════════╗
║ Pattern ║ Replace ║
╠═════════╬═════════╣
║ -JAN- ║ /01/ ║
║ -FEB- ║ /02/ ║
║ -MAR- ║ /03/ ║
║ -APR- ║ /04/ ║
║ -MAY- ║ /05/ ║
║ etc. ║ ║
╚═════════╩═════════╝
问题基本上与this one相同,但给出的答案仅在一次分配一个输入值的结果时起作用 - 我想返回整个结果集。
我在想像递归CTE可能有用......
示例数据
╔═══════════════╦══════════════╗
║ Input ║ Output ║
╠═══════════════╬══════════════╣
║ DataData-JAN- ║ DataData/01/ ║
║ -APR--MAY- ║ /04//05/ ║
║ -MAR-TESTING ║ /03/TESTING ║
╚═══════════════╩══════════════╝
答案 0 :(得分:1)
在你提到的链接中找到解决方案,并将其放在一个函数中:
create table Replacement(ReplaceThis varchar(10), WithThis varchar(10))
insert into Replacement
values ('-JAN-', '/01/'),
('-FEB-', '/02/'),
('-MAR-', '/03/'),
('-APR-', '/04/'),
('-MAY-', '/05/')
create table input(val varchar(100))
insert input
values ('DataData-JAN-'),
('-APR--MAY-'),
('-MAR-TESTING')
go
create function dbo.ReplaceValues(@input varchar(100))
returns varchar(100)
as
begin
select @input = replace(@input, ReplaceThis, isnull(WithThis, ''))
from Replacement
where charindex(ReplaceThis, @input) > 0
return @input
end
go
select val, dbo.ReplaceValues(val)
from input