2015-01-09 29 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中介绍) –