我下表有一欄:基於布爾什麼是其他列真更新是根據另一列
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
我怎樣才能更新類型列。例如 如果「食品」欄爲真,那麼類型將是「食品」等
我下表有一欄:基於布爾什麼是其他列真更新是根據另一列
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
我怎樣才能更新類型列。例如 如果「食品」欄爲真,那麼類型將是「食品」等
可以使用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...
然而,這可能不是在必要所有。您可能會考慮創建一個視圖來顯示此信息,而不是將其存儲在列中。如果其他布爾變化,您需要始終更新Type列以匹配。
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');
+1。 (實際上對於我沒有在我的答案中包含的WHERE條款) –
hmmmmm我覺得你的表結構不正確。這將是最好有一個查找的類型如食品飲料動物從父表如參考
父表
id Type
-------
1 1
2 1
3 2
4 3
查找
id name
-------
1 food
2 drink
3 animal
那麼你可以做一個加入表格
我只是將數據從舊數據庫遷移到新結構。這適用於ELSE情況下的完美 – Alex