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表中字符串相互替换的优化方式的主要内容,如果未能解决你的问题,请参考以下文章

sql 表中一个字段含有大量的中文字符,怎么替换掉

替换数据库表中某个代码段中某个字段的某一段字符串sql

SQL语句替换某表某字段中第几字符

sql server 将字符串第二字符替换为另外一个字符的 方法

t-sql 用户定义函数,用表中的查找替换文本

sql 删除表中的字段的最后一个字符