2010-07-26 116 views
10

我有這樣選擇基於另一列的值的特定列

ID | Type | Val0 | Val1 
1 | 0 | A | NULL 
2 | 1 | NULL | B 

我需要選擇Val0當類型爲0,並且Val1當類型是1,並且ValN表時類型是N ...

我該怎麼做?

+0

您能否提供預期產出的樣本? – 2010-07-26 20:27:43

+0

'SELECT ... WHERE ID = 1 - A' – BrunoLM 2010-07-26 20:29:07

+0

只是一個快速評論:如果你有這樣的表格,你應該考慮一個不同的模式。你的數據庫幾乎肯定不會遵循實體關係模型。 – Borealid 2010-07-26 20:30:18

回答

15
SELECT CASE 
      WHEN Type = 0 THEN Val0 
      WHEN Type = 1 Then Val1 
      . 
      . 
      WHEN Type = N Then ValN 
     END 
    FROM tbl 
+0

這顯然確實有一個問題,但如果你使用另一個數據庫的表,因爲顯然Sql Server然後施加最大數量爲10的情況...這非常小。 – eidylon 2011-11-09 16:46:40

3

我看這個問題的方法,你需要使用UNION:

SELECT a.val0 
    FROM TABLE a 
WHERE a.type = 0 
UNION ALL 
SELECT a.val1 
    FROM TABLE a 
WHERE a.type = 1 
UNION ALL ... 

UNION ALL不刪除重複項,比UNION快(因爲它消除重複)。

動態地做到這一點是可能的。

+0

我將它解釋爲「根據給定的類型給我一個單一的值」。但你可能是完全正確的。這是很好的要求一個預期的輸出:)。 – dcp 2010-07-26 20:30:50

+0

@dcp:我一直被我的錯誤假設咬了太多次 - 我在等待,看看它是否對其他人有意義 – 2010-07-26 20:32:51

2

如果N值低,則可以使用CASE statement,像CASE Type WHEN 0 THEN Val0 WHEN 1 THEN Val1 END做即席。如果你的N更大,你應該規範你的數據庫(即把ID => ValN映射到不同的表中)。

+0

CASE聲明效果很好。規範化建議是好的,但並不總是可行的,當你與別人數據庫進行集成時。不幸。 – eidylon 2011-11-09 16:45:16