我目前需要找一个sql语句来做一些模式识别和替换。以下是我的问题描述:
我需要一个sql语句或者用以下条件替换字符串中的数字的东西。考虑测试字符串:“125.00美元成本,33%百分比” 1.将所有数字后跟美元符号替换为字符串{cost} 2.使用字符串{percentage}
替换百分号前的所有数字预期产出:$ {cost}成本,{coinsurance}%百分比。
示例字符串输入2:$ 25成本--->输出:$ {cost}成本
字符串输入3:33%百分比--->输出:{percentage}%百分比。
字符串输入4:$ 25 ---->输出:$ {cost}
字符串输入5:33%---->输出:{percentage}%
我想出了下面的sql语句来单独替换它们:
DECLARE @Text NVARCHAR(MAX) = '33% percentage'
SELECT STUFF(@Text,PATINDEX('%$[0-9]%',@Text)+1,PATINDEX('%cost%',@Text)-2,'{cost} ')
,PATINDEX('%[0-9][%]%',@Text)- 1, STUFF(@Text,PATINDEX('%[0-9][%]%',@Text)- 1,2,' {percentage}')
以上SQL似乎适用于与百分比文本相关的所有情况,例如文本1。
我需要一个能够正确替换文本的语句。以上声明可单独替换。此外,与“{cost}”替换相关的声明不适用于输入4。
有人可以帮助我使用正则表达式和填充语句来即兴发布。如果我能提供更多详细信息,请联系我。
答案 0 :(得分:1)
不是很优雅,但这是我思考的地方。
示例强>
Declare @YourTable table (SomeCol varchar(150))
Insert Into @YourTable values
('$125.00 Cost, 33% Percentage'),
('$25 Cost'),
('33% Percentage'),
('$25'),
('33%')
Select A.*
,NewString = case when charindex('${cost}',S)>0 and charindex('{percentage}%',S)>0 then replace(S,'{percentage}','{coinsurance}') else S end
From @YourTable A
Cross Apply (
Select S = Stuff((Select ' ' +case when right(RetVal,1)='%' then '{percentage}%'
when left(RetVal,1)='$' then '${cost}'
else RetVal end
From (
Select RetSeq = Row_Number() over (Order By (Select null))
,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace(A.SomeCol,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B1
Order by RetSeq
For XML Path ('')),1,1,'')
) B
<强>返回强>
SomeCol NewString
$125.00 Cost, 33% Percentage ${cost} Cost, {coinsurance}% Percentage
$25 Cost ${cost} Cost
33% Percentage {percentage}% Percentage
$25 ${cost}
33% {percentage}%
编辑 - 删除尾随CRLFc
更改
replace(A.SomeCol,' ','§§Split§§')
要
replace(replace(replace(A.SomeCol,char(10),''),char(13),''),' ','§§Split§§')