SQL表中字符串相互替换的优化方式
Posted
技术标签:
【中文标题】SQL表中字符串相互替换的优化方式【英文标题】:Optimised way of replacing strings with each other in SQL table 【发布时间】:2020-08-26 07:48:05 【问题描述】:问题陈述: 寻找数据量大、案例多的。
考虑一下,我有一张桌子城市
我需要用德里代替班加罗尔,用班加罗尔代替德里,同样可能还有“n”个其他案例。
我知道我们可以在更新中使用大小写来替换表中的数据。有没有更好的方法来使用 Replace() 函数或单个更新中的其他任何东西..?
【问题讨论】:
【参考方案1】:另一种方法是创建一个临时表,例如
create table #tmpReplace(OriginalValue varchar(200), NewValue varchar(200))
并与您的表进行内部连接。优点是更新更简单。缺点是您仍然必须填充此表。
例如:
update yt
set yt.Name = tmp.NewValue
from dbo.YourTable yt inner join #tmpReplace tmp on tmp.Name = OriginalValue
【讨论】:
Temporal Tables。 Temporary Tables.【参考方案2】:老实说,最简单的方法似乎是CASE
表达式:
SELECT ID,
CASE Name WHEN 'Bangalore' THEN 'Delhi'
WHEN 'Delhi' THEN 'Bangalore'
...
ELSE Name
END AS Name
FROM dbo.YourTable;
【讨论】:
如果有'n'个案例,那么我必须写'n'次大小写,有没有比这更好的方法..? 正确,@VishalIPatil。无论您使用什么方法,您都需要将它们写出来。 SQL Server 无法读懂你的想法。它不知道什么需要与什么交换,你需要告诉它。 如问题中所述,我知道这可以在更新中使用套管来实现。只是在寻找替代方案,因为我们正在处理大量数据并且我们遇到了一些性能问题。 替代 what @VishalIPatil 。UPDATE
?
替代套管?【参考方案3】:
我建议在查询中使用“替换”值创建派生表:
update t
set t.name = v.newvalue
from t join
(values ('Delhi', 'Bangalore'),
('Bangalore', 'Delhi'),
. . .
) v(oldvalue, newvalue)
on v.oldvalue = t.name;
【讨论】:
以上是关于SQL表中字符串相互替换的优化方式的主要内容,如果未能解决你的问题,请参考以下文章