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;
【问题讨论】:
您通常不会存储派生数据 只是出于好奇:每个国家/地区是否有一张桌子Chile
suggests?
@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_level
和 income
列总是同步,因为 income_level
是在检索时计算的。因此,如果您添加新行或更新现有行,则值会自动更改。
【讨论】:
以上是关于MySQL 使用多个条件更新列的值的主要内容,如果未能解决你的问题,请参考以下文章