2015-01-09 25 views
1

我有一個表,有四列,我需要concat。其中兩列包含一些NULL值。Postgres:Concat多列,同時包括空值

我需要的結果包含指示所有四列分隔符,就像這樣:

colA,colB,colC,colD 

,或者一列(這裏COLB)爲空,

colA,,colC,colD 

我似乎無法到找到一個乾淨的方式來做到這一點。我得到的最好的是:

concat_ws(colA, COALESCE(colB, ''), COALESCE(colC, ''), colD, ',') 

這感覺很麻煩(特別是因爲我需要重複這樣做)。有沒有更好的辦法?

+0

是的,但我從上面的例子中得到的結果是:colA,colC,colD。不會有逗號/分隔符作爲colB的佔位符。 – user1453804

回答

-2

我認爲你應該使用遊標,然後循環也,以顯示空值,你必須使用NVL()函數,就像這樣:

程序TODO IS 沃克斯在VARCHAR2; CURSOR CUR_TEST IN SELECT NVL(colb,'replace_with'),colA,colD FROM DUAL; 對於CUR_TEST循環中的x開始 vAux:= x.colb ||','|| x.colA ||','|| x.colD; end loop;

end TODO;

對於檢查什麼NVL()的作用:http://www.techonthenet.com/oracle/functions/nvl.php

+1

首先遊標是這個問題的不好的選擇。其次是Postgres,而不是Oracle –

2

自終值不能爲NULL,你不需要擔心保存它們。只需使用一個空字符串。這是你怎麼寫在標準的SQL。

select coalesce(cola, '') || ', ' || 
     coalesce(colb, '') || ', ' || 
     coalesce(colc, '') || ', ' || 
     coalesce(cold, '') 
from your_table_name; 

的CONCAT_WS()函數不會跳過空字符串,但它確實跳過空列。這意味着你仍然需要使用coalesce()。

select concat_ws(', ', coalesce(cola, ''), 
         coalesce(colb, ''), 
         coalesce(colc, ''), 
         coalesce(colb, '')) 
from your_table_name; 
+0

從效率角度來看,比concat_ws函數更好?我一直希望避免的是每次都寫聚合。 (ed:spelling) – user1453804

+0

@ MikeSherrill'CatRecall':Postgres **確實**有'concat_ws()'函數:http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS -STRING-OTHER(它也會跳過空值) –

+0

Ha! * *來自哪裏? (在9.1中介紹) –