假设您在一个类似于下面的表中有一些数据。。。

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

如何返回非空字段的值。以“The White House”为例,我想返回除第3行之外的所有字段的值(因为它有一个空值)。。。
The White House, Pennsylvania Avenue, Washington, 20500

而不是。。。
The White House, Pennsylvania Avenue, **,** Washington, 20500

我正在尝试将ACE/JET/MS访问查询转换为其Postgresql等价查询。在访问中,我使用类似于。。。
Select
    IIF(line1 <> '', ', ' + line1, '')
    + IIF(line2 <> '', ', ' + line2, '')
    + IIF(line3 <> '', ', ' + line3, '')
    + IIF(city <> '', ', ' + city, '')
    + IIF(zipcode <> '', ', ' + zipcode, '') as CustDetails
From addresses

这会给我我所需要的。然而,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

只是回来。。。
custDetails
The White House,

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

最佳答案

使用concat_ws()(concat“with separator”)可以正确处理空字符串和空字符串:

SELECT concat_ws(',', line1, line2, line3, line4, city, zipcode) as cust_details
FROM addresses;

如果任何元素为空或为空字符串(''),则不会添加分隔符

关于sql - PostgreSQL仅连接非空字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48241983/

10-10 06:46