如何在高效查询中快速批量更新值?

Posted

技术标签:

【中文标题】如何在高效查询中快速批量更新值?【英文标题】:How do I mass update values quickly in an efficient query? 【发布时间】:2020-09-22 20:31:42 【问题描述】:

我有 3 个包含相同列的表,Report Year

我想更新任何没有描述的报告年份。例如,查看下面的示例数据,您可以看到有些年份没有任何后缀,例如 6+6 或 7+5。

那些没有后缀并且只是独立的年份(即2020、2021等),我想给它们添加一个后缀“LTP”,这样它们就会变成“2020 LTP”、“2021” LTP'等... 那些独立年份但以字符开头的年份,例如 BP19,不应更新!

伪查询:

UPDATE table1, table2, table3
SET 
    [Report Year] = [Report Year].append(' LTP')
WHERE
    [Report Year].count < 5;

我在我的伪代码中使用计数作为条件,因为这是我能想到的使查询足够智能以识别哪一年有后缀和什么没有后缀的唯一方法,以便它可以附加后缀“LTP”因此。如果有更好的方法可以做到这一点,我很乐意看到它:)

报告年份列中的示例值:

Table1(这有报告年份作为主键,因此只有唯一/不同的值):

Report Year
2020 5+7
BP19
2020
2020 6+6
2020 7+5
2021
2022 4+8
2022 
2022

表2:

Report Year
2020
2020
2020
2020 6+6
2021
2022 4+8
2022 BP
2022
2020 6+6
2020
2020 6+6
2021
2022 4+8
2022
2022 
2022

表3:

Report Year
2020 5+7
2020 5+7
2020
2020
BP19
2020
2020 6+6
2020 7+5
2021
2022 4+8
2022 
2022
2020 6+6
2020 6+6
2020 7+5
2021
2022 4+8
2022 
2022 

【问题讨论】:

【参考方案1】:

您的伪代码翻译为四个update 语句:

update table1
set [Report Year] = concat([Report Year], ' LTP')
where len([Report Year]) = 4;

update table2
set [Report Year] = concat([Report Year], ' LTP')
where len([Report Year]) = 4;

update table3 ...

update table4 ...

逻辑是识别报告年份只有4个字符的记录,然后附加字符串“LTP”。 4 个表中的每一个都独立于其他表,因此运行 4 个查询是正确的方法。


如果您想过滤仅包含数字而不是由 4 个字符组成的报告年份,请使用 not like 和模式匹配:

where [Report Year] NOT LIKE '%[^0-9]%'

这句话为:报告年份不应包含任何非数字字符。

【讨论】:

我明白了!并且计算字符是唯一的方法吗?我喜欢考虑几种方法,所以想检查一下这种计算字符的情况是否真的是实现这一目标的唯一方法:) @Cataster:对于您的用例,它看起来像是一种相关的方法。否则你需要描述你想要的逻辑。 其实有一个小问题。我们还有其他年份,例如 BP19、BP20 等,由于它们的长度为 4 个字符,因此它们也将被计算在内。我不想数他们。我只想数年。有没有办法我们可以添加更多逻辑,从而避免以 BP 开头的年份,或者通常以字符而不是数字开头的年份? @Cataster:我更新了我的答案以仅过滤所有数字报告年份。 顺便说一句,sql中concat的反义词是什么?假设我想恢复这些更改,是替换()吗?【参考方案2】:

为确保[Report Year] 列仅包含 4 位不带后缀的年份,您可以进行测试以确保 4 个字符以 1 或 2 开头,其余 3 个字符为 [0-9]。像这样的

update table1
set [Report Year] = concat([Report Year], ' LTP')
where [Report Year] like '[1-2][0-9][0-9][0-9]';

update table2
set [Report Year] = concat([Report Year], ' LTP')
where [Report Year] like '[1-2][0-9][0-9][0-9]';

update table3 ...

update table4 ...

【讨论】:

以上是关于如何在高效查询中快速批量更新值?的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSql 中批量更新或删除哪个更高效?

sql在update更新时如何快速且大批量的更新数据

sql在update更新时如何快速且大批量的更新数据(C#中写的)

一招教你数据仓库如何高效批量导入与更新数据

一招教你如何高效批量导入与更新数据

MongoDB批量更新不同查询条件的数据