2014-01-18 78 views
0

我需要一些幫助COALESCE。動態傳遞列凝聚

語法:COALESCE(Col1,Col2,Col3...)這意味着每一次我將不得不寫裏面列名作爲參數的時間。

我的問題是我們可以動態傳遞的列名這個功能呢?因爲列中的列數不斷變化。

感謝, 希德

+2

您的設計聽起來可能沒有正常化。如果列數不斷變化,並且列代表足夠類似的東西,那麼您可以使用'COALESCE'。 Col1,Col2,Col3等代表什麼? –

+0

嗨馬丁 - 每列包含父子元數據,但以不齊整的層次結構(樓梯)格式。由於其中有單元格爲NULL,所以我試圖向左移動數據並填充空單元格。現在由於層次結構的變化,我可能每次都有不同數量的列。 – user3209759

+0

請提供您的數據和期望結果的樣本。 –

回答

0

銥聽起來像是你有一堆列,並且要值到左側,NULL s移動到右側。

您可以通過每個值前計數的非NULL值的數目,然後使用case語句來賦值做到這一點。以下顯示了四列的代碼:

select (case when col1_n = 1 then col1 
      when col2_n = 1 then col2 
      when col3_n = 1 then col3 
      when col4_n = 1 then col4 
     end) as col1, 
     (case when col2_n = 2 then col2 
      when col3_n = 2 then col3 
      when col4_n = 2 then col4 
     end) as col2, 
     (case when col3_n = 3 then col3 
      when col4_n = 3 then col4 
     end) as col3, 
     (case when col4_n = 4 then col4 
     end) as col4 
from (select t.*, 
      (case when col1 is not null then 1 end) as col1_n, 
      ((case when col1 is not not null then 1 else 0 end) + 
       (case when col2 is not null then 1 end) 
      ) as col2_n, 
      ((case when col1 is not not null then 1 else 0 end) + 
       (case when col2 is not null then 1 else 0 end) + 
       (case when col3 is not null then 1 end) 
      ) as col3_n, 
      ((case when col1 is not not null then 1 else 0 end) + 
       (case when col2 is not null then 1 else 0 end) + 
       (case when col3 is not null then 1 else 0 end) + 
       (case when col4 is not null then 1 end) 
      ) as col4_n    
     from t 
    ) t; 

您可以在SQL小提琴(here)上看到此作品。

如果您有一個獨特的id for each,您還可以取消轉發數據,使用row_number()並重新傳輸數據。

+0

謝謝Gordon的回覆。似乎上面的代碼是爲了知道(固定)的列數?我的表格中的列數不斷變化。你能告訴我,如果我可以動態地將列傳遞給COALESCE嗎? – user3209759

+0

@ user3209759。 。 。一個表具有固定數量的列,即SQL定義。這聽起來像你可能需要動態SQL或者重新設計的應用程序。從表中添加和刪除列的應用程序聽起來像一個糟糕的設計。 –

+0

我的表格最多有20列。其中可以說我有10列的數據,剩餘的單元將被替換爲NULL。我想我將不得不在硬編碼col1到col20在COALESCE而不是傳遞非NULL的列。我也會看到你所建議的動態SQL選項。謝謝... – user3209759