Postgresql 仅连接非空字符串

Joh*_*nny 1 sql postgresql if-statement

想象一下,您在类似于以下的表中有一些数据......

line1               line2               line3       city        zipcode
1 Any Road          NULL                NULL        Big Apple   12345
The White House     Pennsylvania Avenue NULL        Washington  20500
10 Downing Street   NULL                NULL        London      SW1A 2AA
Run Code Online (Sandbox Code Playgroud)

如何返回非空字段的值。以“白宫”作为一个例子,我想为所有领域的返回值除3号线(因为有一个空值)...

The White House, Pennsylvania Avenue, Washington, 20500
Run Code Online (Sandbox Code Playgroud)

相对于...

The White House, Pennsylvania Avenue, **,** Washington, 20500
Run Code Online (Sandbox Code Playgroud)

我正在尝试将 ACE/JET/MS Access 查询转换为其等效的 Postgresql。在 Access 中,我使用类似于...的 IIF

Select
    IIF(line1 <> '', ', ' + line1, '')
    + IIF(line2 <> '', ', ' + line2, '')
    + IIF(line3 <> '', ', ' + line3, '')
    + IIF(city <> '', ', ' + city, '')
    + IIF(zipcode <> '', ', ' + zipcode, '') as CustDetails
From addresses
Run Code Online (Sandbox Code Playgroud)

这将给我我所需要的。但是,Postgres 似乎没有 IIF 条件。我想我需要使用“CASE WHEN THEN”,但我正在努力解决嵌套问题。例如 ....

SELECT 
 CASE 
     WHEN line1 <> '' THEN line1  || ', '
     WHEN line2 <> '' THEN line2  || ', '
     WHEN line3 <> '' THEN line3  || ', '
     WHEN line4 <> '' THEN line4
 END AS CustDetails
FROM addresses
Run Code Online (Sandbox Code Playgroud)

刚回来……

custDetails
The White House,
Run Code Online (Sandbox Code Playgroud)

如何嵌套 Case 语句以仅在结果中显示非空值?

a_h*_*ame 6

使用concat_ws()(concat "with separator") 它将正确处理空值:

SELECT concat_ws(',', line1, line2, line3, line4, city, zipcode) as cust_details
FROM addresses;
Run Code Online (Sandbox Code Playgroud)

如果任何元素为空,则不会添加分隔符。

如果您需要它来忽略空字符串,请使用 nullif:

SELECT concat_ws(',', line1, nullif(line2,''), nullif(line3,''), nullif(line4,''), city, zipcode) as cust_details
FROM addresses;
Run Code Online (Sandbox Code Playgroud)