MySQL 使用多个条件更新列的值

Posted

技术标签:

【中文标题】MySQL 使用多个条件更新列的值【英文标题】:MySQL updating a column's values with multiple conditions 【发布时间】:2020-10-31 09:52:02 【问题描述】:

我是 mysql 新手,我目前正在努力学习提高它的效率。在这种情况下,我有一个包含人们收入的数据库,我想创建一个新列income_level,根据收入表示低、中或高收入。我已经在四个查询中做到了这一点,但我确信它可以更有效地完成?有人可以给我提示吗?谢谢!

到目前为止,这是我的查询:

ALTER TABLE Chile
ADD COLUMN `income_level` VARCHAR(50) NULL DEFAULT NULL AFTER `income`;

UPDATE Chile SET income_level = "Low income"
WHERE income < 10000;

UPDATE Chile SET income_level = "Middle income"
WHERE income > 10000;

UPDATE Chile SET income_level = "High income"
WHERE income > 100000;

【问题讨论】:

您通常不会存储派生数据 只是出于好奇:每个国家/地区是否有一张桌子Chilesuggests? @Filburt ,是的,这是正确的。但我使用的数据集纯粹是为了练习,不包含准确和/或真实的数据。 @coderfrombiz 如果您知道其中的含义,那当然没问题 - 但是将这个上下文(准备非结构化数据进行分析)添加到您的问题中可能会有所帮助,正如您所看到的答案和 cmets倾向于“但你做错了!”这是由一些看似糟糕的 RDBMS 设计决策引发的。 【参考方案1】:

GMB 的解决方案是 100% 正确的,但我仍然不会那样做。您不需要额外的列income_level,因为您可以动态选择它。这样,当收入水平的定义由于例如通货膨胀或其他原因。

所以今年你的查询可能是这样的:

SELECT CASE WHEN income > 100000 THEN 'High income'
            WHEN income >  10000 THEN 'Middle income'
            ELSE 'Low income' 
        END AS income_level
FROM chile

从现在起的五年后,它可能看起来像这样:

SELECT CASE WHEN income > 150000 THEN 'High income'
            WHEN income >  15000 THEN 'Middle income'
            ELSE 'Low income' 
        END AS income_level
FROM chile

更新:如果收入可能为空并且您不想将其视为“低收入”,您可以这样做:

SELECT CASE WHEN income IS NULL  THEN 'Unknown income level'
            WHEN income > 100000 THEN 'High income'
            WHEN income >  10000 THEN 'Middle income'
            ELSE 'Low income' 
        END AS income_level
FROM chile

【讨论】:

【参考方案2】:

使用case 表达式:

update chile
set income_level = case
    when income > 100000 then 'High income'
    when income >  10000 then 'Middle income'
    else 'Low income'
end

如果income 可能是null 并且您不想更新相应的行,那么您可以在查询中添加where 子句。

【讨论】:

【参考方案3】:

实际上,虽然GMB 的回答是正确的,但我对rf1234 的看法却是相当强烈的。您不想在SELECT 查询中实现此逻辑,因为该逻辑分布在太多代码中。您可以使用视图,但有更好的解决方案。

我认为计算income_level 的最佳方法是使用生成的列:

alter table chile
    add income_level varchar(255) generated always as
        (case when income > 100000 then 'High income'
              when income >  10000 then 'Middle income'
              else 'Low income'
         end);

为什么这是一个改进? income_levelincome总是同步,因为 income_level 是在检索时计算的。因此,如果您添加新行或更新现有行,则值会自动更改。

【讨论】:

以上是关于MySQL 使用多个条件更新列的值的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何根据一列值更新另一列的值?

在 laravel 中一次更新多个列的值

用多个值更新一列的值

如何在mysql中特定列的单个单元格中插入多个整数值

SQLAlchemy 更新多个 WHERE 条件

具有多个条件的数据表选择