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
子句,我的答案中没有包括该子句)