连接字符串同时满足空值

bd5*_*528 1 sql oracle string-concatenation

我有以下脚本: -

select
siteid
address1,
address2,
address3,
address4,
address5
from tblsites
Run Code Online (Sandbox Code Playgroud)

......可能会返回类似的东西: -

siteid address1     address2 address3   address4   address5
123    1 New Street NULL     New Town   NULL       Newvile
456    2 Elm Road   NULL     NULL       New York   New York
Run Code Online (Sandbox Code Playgroud)

在Oracle中是否可以可靠地连接这些数据,满足空值,并用逗号分隔字符串.因此,上述数据的所需输出为: -

siteid address
123    1 New Street, New Town, Newvile
456    2 Elm Road, New York, New York
Run Code Online (Sandbox Code Playgroud)

MT0*_*MT0 7

您可以NVL2用来检查地址组件是否为非null:

SQL小提琴

Oracle 11g R2架构设置:

CREATE TABLE tblsites ( siteid, address1, address2, address3, address4, address5 ) AS
  SELECT 123, '1 New Street', CAST( NULL AS VARCHAR2(50) ), 'New Town', NULL, 'Newvile' FROM DUAL UNION ALL
  SELECT 456, '2 Elm Road', NULL, NULL, 'New York', 'New York' FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

查询1:

SELECT siteid,
       RTRIM(
            NVL2( address1, address1 || ', ', NULL )
         || NVL2( address2, address2 || ', ', NULL )
         || NVL2( address3, address3 || ', ', NULL )
         || NVL2( address4, address4 || ', ', NULL )
         || NVL2( address5, address5 || ', ', NULL ),
         ', '
       ) AS address
FROM   tblsites
Run Code Online (Sandbox Code Playgroud)

结果:

| SITEID |                         ADDRESS |
|--------|---------------------------------|
|    123 | 1 New Street, New Town, Newvile |
|    456 |  2 Elm Road, New York, New York |
Run Code Online (Sandbox Code Playgroud)