有没有更好的方法对字符串进行多次替换?

Posted

技术标签:

【中文标题】有没有更好的方法对字符串进行多次替换?【英文标题】:Is there a better way to do multiple replace on a string? 【发布时间】:2015-03-03 07:07:45 【问题描述】:

我有一个 varchar 列,其中包含以下字符串的变体:

Stations, FlightName, FlightWeeks, BindTo, SpotLength, foo, bar, etc...

我需要将其更改为 StationsStationFlightNameFlight NameBindToBind To 等最终变成这样:

Station; Flight Name; Weeks; Bind To; Spot Length; foo; bar

我有一个非常丑陋的代码来做到这一点:

 select replace(replace(replace(replace(replace(replace(GroupFlightsBy, ', ', ';'), 
'Stations', 'Station'), 'FlightName', 'Flight Name'), 'FlightWeeks', 'Weeks'), 'BindTo', 'Bind To'), 
'SpotLength', 'Spot Length')

有没有更好的方法来做到这一点,但性能更好?

【问题讨论】:

首先想到的不是字符串替换;但听起来您是在 varchar 列中合并数据,而不是使用单独的列。这些值是什么意思? @SimonSvensson 基本上这些是多选下拉框中的值。数据已经存在 - 我无法更改它。 为什么不能更改数据库?它是否存储在某些只读媒体上?或者您是说您作为开发人员并假定在开发过程中最了解情况,却没有进行更改的权限? (主要问题;数据库总是可以更改的;不更改的要求通常是从某个人性化的地方强加的。) @AngryHacker 所以你要处理固定数量的数据(如 Stations、FlightName 等),对吧? @SelvaTS 是的,固定数据。 【参考方案1】:

您可以在 TSQL 中编写自己的转换函数,但我认为它的性能不如多重替换。 您应该避免在 WHERE/ORDER 子句中使用多重替换

【讨论】:

【参考方案2】:

创建 CLR 函数是通过替换单个函数来调用多个 REPLACE 函数的解决方案。是的,使用 CLR 函数有一些性能注意事项,但如果您要处理少量数据,那就没问题了。

用于创建 CLR 函数,

Enabling CLR

Creating CLR project

Creating a sample CLR function

根据您的要求,我创建了一个这样的示例函数,

using System.Data.SqlTypes;

public partial class UserDefinedFunctions

    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlString ReplaceFunc(string inputString)
    
        return new SqlString (inputString
            .Replace("Stations", "Station")
            .Replace("FlightName", "Flight Name")
            .Replace("FlightWeeks", "Weeks")
            .Replace("BindTo", "Bind To")
            .Replace("SpotLength", "Spot Length")
            .Replace(", ", ";"));
    
;

并像这样从 SQL 调用,

DECLARE @GroupFlightsBy VARCHAR(MAX) = 'Stations, FlightName, FlightWeeks, BindTo, 
SpotLength, foo, bar'

SELECT dbo.ReplaceFunc(@GroupFlightsBy)

有关 CLR 函数的更多信息,

http://sqlmag.com/database-development/common-language-runtime-dba-point-view

https://***.com/a/25876797/311255

【讨论】:

确定你可以通过 clr 来完成。但是多重替换也可以通过 tsql 函数来完成,这将更容易维护并且执行速度更快。那么为什么这是解决方案呢?【参考方案3】:

我喜欢 CLR 的想法。 而且要求也不是很系统。就像FlightWeeks变成了Weeks。为什么?

试试我的脚本,除了 FlightWeeks 之外它工作正常

DECLARE @Temp VARCHAR(100)='FlightName'

Declare @Pattern1 as varchar(50)
Declare @Pattern2 as varchar(50)='%s%'
Declare @flg bit=0
  Set @Pattern1 = '%[^ ][A-Z]%'

   While PatIndex(@Pattern1 collate Latin1_General_Bin, @Temp) > 0
BEGIN
        Set @Temp = Stuff(@Temp, PatIndex(@Pattern1 collate Latin1_General_Bin, @Temp) + 1, 0, ' ')

       set @flg=1
END
    if(@flg=0)
    if   PatIndex('%s%' , substring(@Temp,len(@temp),1)) >0
         Set @Temp = substring(@Temp,0,len(@temp))

select @Temp

--'FlightName' return Flight Name
--Stations return Station
-- foo return foo
--FlightWeeks return Flight Weeks

【讨论】:

以上是关于有没有更好的方法对字符串进行多次替换?的主要内容,如果未能解决你的问题,请参考以下文章

python pandas用数字替换数据框中的字符串

如何在保留原始字符串的同时对字符串执行 Perl 替换?

限制 JSON 字符串化深度

出于好奇 - 是不是有更好的执行方法来替换此字符串?

QT textedit实现查找替换

Oracle 正则表达式替换用逗号包围的字符串的多次出现