SQL 用新值替换旧值

Posted

技术标签:

【中文标题】SQL 用新值替换旧值【英文标题】:SQL replace old values with new ones 【发布时间】:2010-12-10 09:28:53 【问题描述】:

我有一个名为tbl.Products 的表,其中有一个名为articlenumber 的列,其中包含s401s402 等数字。

我生成了一个带有新货号的列表,它将替换旧货号:

s401  I00010  
s402  I00020  
s403  I00030  
s403  I00040  
...  

我有一个查询,我希望它能够解决,但不知何故它什么也没做。

(当然我已经将其他值嵌套到查询中)

SELECT REPLACE('articlenumber','s401','I00010') FROM tbl.Products

如何在这样的列中获取用新值替换旧值的查询?

【问题讨论】:

您在 tblProducts 中使用了多少行?多少对旧/新货号? 【参考方案1】:

进行替换可能会出现问题(如果您有文章 s401 和 s4010 怎么办?),因此这样做会更健壮:

Update tblProducts
SET articlenumber = 'I000010'
Where articlenumber = 's401';

如果您有许多更改要做,您可以生成一个小脚本(例如使用 Excel,正如 TheButcher 建议的那样),或者您可以将数据导入到一个小表 tblVals 中,其中包含 oldVal 和 newVal 列,然后使用这个语句:

Update tblProducts p
SET articlenumber = (Select newVal
    From tblVals
    where oldVal = p.articlenumber);

这允许您在一个语句中进行更新,这再次比运行脚本更健壮,如果脚本真的很长,可能会遇到问题。

第三个想法是在 SQL(或存储过程)中为旧号码(如果存在这样的东西)构造新号码的逻辑,如下所示:

Update tblProducts p
SET articlenumber = 'I0000' || Right(articlenumber,1) || '0'

(当然,这是完全简化的,对于您的 30k 行可能还不够)。

【讨论】:

"更新 tblProducts SET articlenumber = 'I000010' where articlenumber = 's401';" = 天赐之物! :D 处理 30k 行时!!【参考方案2】:

您只是选择新替换的值,而不是对它们做任何事情...使用替换时这是一个非常好的主意,请始终先选择以仔细检查您是否会得到预期的结果:)

更新代码 -

Update  tbl.Products
Set articlenumber = replace(articlenumber, 's401', 'I00010') 

【讨论】:

很好的答案可能会告诉我如何多次执行此操作? 我认为最好的方法是在 excel 中完成。在 A 列中有旧值,在 B 列中有新值。然后在 C 列中用值的占位符编写查询 - 更新 tbl.Products Set articlenumber = replace(articlenumber, '&A1&', '&B1');然后只需将单元格右下角的那个黑色小工具提示一直拖到电子表格和中提琴的底部,它就会生成所有脚本。希望对你有帮助 我忘记了 B1 后面的“&”:D 非常感谢您这么快,我刚刚完成,然后将查询复制到 Microsoft SQL Server Management Studio Express 中。但是,当我执行查询时,我只收到一条消息,表明 30000 行受到影响,然后我看不到任何视图。当我回到表格视图时,什么都没有改变。我做错了什么? 30 000 行受影响仍会显示,告诉您查询已针对 30 000 行运行。如果没有任何变化,这意味着您尝试更新的数据与您的声明不匹配。确保语句是 UPDATE table SET column = replace(column,'OLDVALUE','NEWVALUE');你有样品给我吗?

以上是关于SQL 用新值替换旧值的主要内容,如果未能解决你的问题,请参考以下文章

简单的介绍变量

表单元素不返回新值

SQL Server 2017 触发器将旧值作为更新后的新值

如何在 SQL Server 的触发器中获取多个字段的旧值和新值?

Node.js -Firebase 服务帐户私钥不会解析

存储现有值时,Java的HashMap密钥替换