【问题标题】: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 是的,固定数据。

标签: sql sql-server


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    用于创建 CLR 函数,

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

    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://stackoverflow.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2019-08-22
      相关资源
      最近更新 更多