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

时间:2015-03-03 07:07:46

标签: sql sql-server

我有一个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')

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

3 个答案:

答案 0 :(得分:1)

您可以在TSQL中编写自己的Transformation-Function,但我认为它不会像多替换那样高效。 您应该避免在WHERE / ORDER子句中使用多重替换

答案 1 :(得分:0)

创建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

答案 2 :(得分:0)

我喜欢CLR的想法。 此外,要求也不是很系统。就像FlightWeeks成为Weeks.Why?

尝试我的脚本,除了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