Mysql 基于另一列更新列
我有下表:Mysql 基于另一列更新列,mysql,sql,Mysql,Sql,我有下表: ID Type Food Drink Animal -------------------------------------- 1 NULL Y N N 2 NULL Y N N 3 NULL N Y N 4 NULL N Y N 5 NULL N N Y 如何根据其他列中的布尔值更新类型列。例如 如果'Food'列为true,则类型将为'Food'等您可以在更新查询中使用
ID Type Food Drink Animal
--------------------------------------
1 NULL Y N N
2 NULL Y N N
3 NULL N Y N
4 NULL N Y N
5 NULL N N Y
如何根据其他列中的布尔值更新类型列。例如
如果'Food'列为true,则类型将为'Food'等您可以在
更新
查询中使用案例
:
UPDATE tbl SET Type =
CASE
WHEN Food = 'Y' THEN 'Food'
WHEN Drink = 'Y' THEN 'Drink'
WHEN Animal = 'Y' THEN 'Animal'
END
WHERE ...some condition if necessary...
然而,这可能根本没有必要。您可以考虑创建一个视图来显示此信息,而不是将其存储在列中。如果其他布尔值发生变化,则需要始终更新类型列以进行匹配
CREATE OR REPLACE VIEW type_vw AS (
SELECT
ID,
CASE
WHEN Food = 'Y' THEN 'Food'
WHEN Drink = 'Y' THEN 'Drink'
WHEN Animal = 'Y' THEN 'Animal'
END as Type
FROM tbl
);
您不需要“类型”列,您可以派生该信息,例如:
select ID,
case
when Food='Y' then 'Food'
when Drink='Y' then 'Drink'
when Animal='Y' then 'Animal'
else 'None'
end as Type
from mytable
但是,我建议您更改模式,以便有一个单独的类型表,其中包含列TypeID和列Name。然后,在主表中有一个TypeID列
如果需要一个实体可以有多个类型,您可以添加一个交集表。正确的答案(根据注释)是拥有一个规范化的数据库,那么这将不是一个问题
错误的答案是:
UPDATE badtable
SET type=(
CASE
WHEN Food='Y' THEN 'FOOD'
WHEN Drink='Y' THEN 'DRINK'
WHEN Animal='Y' THEN 'ANIMAL'
ELSE 'WTF?'
)
WHERE type IS NULL
AND (Food='Y' OR Drink='Y' OR Animal='Y');
嗯,我认为你的桌子结构不正确。最好将类型(例如食品饮料动物)与父表(例如 父表
id Type
-------
1 1
2 1
3 2
4 3
查找
id name
-------
1 food
2 drink
3 animal
然后就可以对表进行连接了我只是将数据从旧数据库迁移到新结构。对于ELSE情况,这非常适合+1。(实际上是关于
WHERE
子句,我的答案中没有包括该子句)