2009-08-26 67 views
5

我有很多列的表,說我有列SQL如何找到非空列?

A,B,C,d

在這些列

,在任何一個記錄只有一列將被填充其他將始終爲NULL。

我需要一個select語句,它將返回非空列的列。

我試過coalesce,但是這會返回一個值,而不是值所屬的列。

任何人都知道最簡單的方法來做到這一點?

+0

SQL查詢只能返回值,而不能是列。您當然可以將該值解釋爲列名稱。 – 2009-08-26 10:11:00

+0

是的你是正確的,我推測,由於列包含非空值,這是我感興趣的列。 – Darknight 2009-08-26 10:18:21

+0

這看起來像個很糟糕的主意 – finnw 2009-08-26 10:23:32

回答

8
SELECT 
    CASE 
     WHEN A IS NOT NULL THEN 'A' 
     WHEN B IS NOT NULL THEN 'B' 
     WHEN C IS NOT NULL THEN 'C' 
     WHEN D IS NOT NULL THEN 'D' 
    END 
FROM 
    MyTable 
+0

優秀的這個工作!有時候簡單是最好的,不知道我爲什麼總是在想這個問題:o) – Darknight 2009-08-26 10:16:32

4

嘗試的情況下...

SELECT 
CASE WHEN A IS NOT NULL THEN 'A' WHEN B IS NOT NULL THEN 'B' WHEN C IS NOT NULL THEN 'C' WHEN D IS NOT NULL THEN 'D' END as NotNullCol, OtherCols 
FROM YourTable 
+0

好的,我會試試這個。 – Darknight 2009-08-26 10:10:56

2

不漂亮,但這個你想要做什麼:

select case 
    when a is not null then 'a' 
    when b is not null then 'b' 
    when c is not null then 'c' 
    when d is not null then 'd' 
end 
3

當你發現自己要做的事情多列集,你或許你的模式錯了。

將A,B,C和D分隔到獨立表中的單獨行中,將它們綁回到原始表中的行並創建一個JOIN類型的查詢幾乎肯定會更容易。或者,如果只有一個非NULL,我會選擇兩列,類型(A,B,C或D)和值。那麼你不會浪費每一行中的列,並且查詢是非常容易的(假設類型相同)。

但是,您可以這種方式與case做到這一點:

select case 
    when A is not null then 'A' 
    when B is not null then 'B' 
    when C is not null then 'C' 
    else     'D' 
    end 
from ... 

的語法可能不完全正確的,你需要看看它。由於我認爲這是個不好的主意,所以我不會這樣做(選擇的每行函數從來沒有的規模)。

+0

感謝Pax對於這些信息的困擾,我曾想過實際上只有兩列,最初例如:ModuleType和ModuleID,但是之後我需要維護另一個表!但你可能對縮放比例是正確的。 我認爲在這種情況下,我知道列是非常不願意改變(例如擴大) – Darknight 2009-08-26 10:21:41

+0

另一個表格在ModuleID的'查找'表意義上。 也應該輸入'nugget'oops:o) – Darknight 2009-08-26 10:22:39

0

我會重新設計。這幾乎是alawys以這種方式存儲數據是一個壞主意,而不是在相關表格中。

在相關表格中,您可以更輕鬆地查詢信息。您還可以更輕鬆地對僅允許一條記錄的數據進行約束,這樣您可能會獲得更好的數據完整性。

表格數量減少並不一定意味着關係數據庫中的訪問速度更快或設計更好。 porperly設計和索引相關表格通常是相當不錯的。雖然你可能認爲你永遠不需要第五列,但業務規則會改變,我已經看到許多人們認爲不需要擴展的事情,但事實證明這需要可擴展性。