SQL Server中的模式查找和替换

时间:2018-05-09 14:56:43

标签: sql-server

我目前需要找一个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。

有人可以帮助我使用正则表达式和填充语句来即兴发布。如果我能提供更多详细信息,请联系我。

1 个答案:

答案 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§§')