Oracle 连接条件

Oracle concatenate with conditions

我需要用逗号连接来自不同列的数据。但是,该列也可能具有空值,因此不再需要之间的逗号。这意味着,它之间应该有逗号,但是如果 ADDR4 或 ADDR5 没有数据,那么它应该忽略添加的逗号

这是我试过的,但是当最后两列没有数据时它显示了额外的逗号

SELECT ADDR1 ||','||ADDR2 ||','||ADDR3 ||','||ADDR4 ||','||ADDR5 作为地址, 来自地址数据

output with extra comma

包括CASE(或DECODE),例如

select addr1 || case when addr2 is not null then ','|| addr2 end
             || case when addr3 is not null then ','|| addr3 end
             || case when addr4 is not null then ','|| addr4 end
             || case when addr5 is not null then ','|| addr5 end as address
from addrdata

对#Littlefoot 的小修正。当 addr1 为空(或)开头的连续列为空时,共享查询将 return 前导 ','。在这种情况下,需要检查所有先前的字段。

可能的解决方法是,

SELECT RTRIM ( CASE WHEN addr1 IS NOT NULL THEN addr1 || ',' ELSE NULL END
        || CASE WHEN addr2 IS NOT NULL THEN addr2 || ',' ELSE NULL END
        || CASE WHEN addr3 IS NOT NULL THEN addr3 || ',' ELSE NULL END
        || CASE WHEN addr4 IS NOT NULL THEN addr4 || ',' ELSE NULL END
        || CASE WHEN addr5 IS NOT NULL THEN addr5 || ',' ELSE NULL END, ',')
      AS address
  FROM addrdata

使用 DECODE 的解决方案类似于,

SELECT RTRIM (   DECODE (addr1, NULL, NULL, addr1 || ',')
              || DECODE (addr2, NULL, NULL, addr2 || ',')
              || DECODE (addr3, NULL, NULL, addr3 || ',')
              || DECODE (addr4, NULL, NULL, addr4 || ',')
              || DECODE (addr5, NULL, NULL, addr5 || ','),
              ','
             ) AS address
  FROM addrdata