有没有更好的方法对字符串进行多次替换?
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...
我需要将其更改为 Stations
到 Station
、FlightName
到 Flight Name
、BindTo
到 Bind 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
【讨论】:
以上是关于有没有更好的方法对字符串进行多次替换?的主要内容,如果未能解决你的问题,请参考以下文章