基于另一列更新列

时间:2011-11-11 15:15:47

标签: 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

如何根据其他列中的boolean为true来更新Type列。例如 如果'Food'列为true,则Type将为'Food'等

4 个答案:

答案 0 :(得分:3)

您可以在CASE查询中使用UPDATE

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
);

答案 1 :(得分:3)

正确的答案(根据评论)是有一个规范化的数据库 - 那么这不会是一个问题。

错误的答案是:

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');

答案 2 :(得分:1)

您不需要Type列,您可以派生该信息,例如:

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

但是,我建议您更改架构,以便拥有一个单独的Type表,其中包含TypeID和Name列。然后,在主表中,您将拥有一个TypeID列。

如果要求实体可以有多个类型,则应添加交集表。

答案 3 :(得分:0)

嗯,我认为你的表格结构不正确。最好是使用父表中的引用来查找食物饮料动物等类型,例如

父表

id Type
-------
1  1
2  1
3  2
4  3

查找

id name
-------
1  food
2  drink
3  animal

然后你可以在表格上加入