我有下表:
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'等
答案 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
然后你可以在表格上加入