2011-11-11 70 views
0

我下表有一欄:基於布爾什麼是其他列真更新是根據另一列

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 

我怎樣才能更新類型列。例如 如果「食品」欄爲真,那麼類型將是「食品」等

回答

3

可以使用CASEUPDATE查詢中:

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

我只是將數據從舊數據庫遷移到新結構。這適用於ELSE情況下的完美 – Alex

1

你不需要類型列中,你可以得到這些信息,如:

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列。

如果要求實體可以有多個類型,則需要添加一個相交表。

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

+1。 (實際上對於我沒有在我的答案中包含的WHERE條款) –

0

hmmmmm我覺得你的表結構不正確。這將是最好有一個查找的類型如食品飲料動物從父表如參考

父表

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

查找

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

那麼你可以做一個加入表格