仅连接非空字符串的Postgresql

仅连接非空字符串的Postgresql,sql,postgresql,if-statement,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

假设您在一个表中有一些数据,如下所示

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
如何为非空字段返回值。以“白宫”为例,我想返回除第3行之外的所有字段的值(因为它有一个空值)

相对于

The White House, Pennsylvania Avenue, **,** Washington, 20500
我正在尝试将ACE/JET/MS Access查询转换为它的Postgresql等价物。在Access中,我使用类似于

Select
    IIF(line1 <> '', ', ' + line1, '')
    + IIF(line2 <> '', ', ' + line2, '')
    + IIF(line3 <> '', ', ' + line3, '')
    + IIF(city <> '', ', ' + city, '')
    + IIF(zipcode <> '', ', ' + zipcode, '') as CustDetails
From addresses
如何嵌套Case语句以仅在结果中显示非空值?

您正在查找:

您正在寻找:

使用
concat\u ws()
(concat“带分隔符”),它将正确处理空值:

SELECT concat_ws(',', line1, line2, line3, line4, city, zipcode) as cust_details
FROM addresses;
如果任何元素为null,则不会添加分隔符

如果需要它忽略空字符串,请在以下情况下使用null:

SELECT concat_ws(',', line1, nullif(line2,''), nullif(line3,''), nullif(line4,''), city, zipcode) as cust_details
FROM addresses;
使用
concat\u ws()
(concat“带分隔符”),它将正确处理空值:

SELECT concat_ws(',', line1, line2, line3, line4, city, zipcode) as cust_details
FROM addresses;
如果任何元素为null,则不会添加分隔符

如果需要它忽略空字符串,请在以下情况下使用null:

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

谢谢戈登,我感谢你的时间和帮助。一匹没有名字的马用同样的答案把你赶上了岗位,所以我接受了这个答案,但是+1是你的。@Johnny。你可以接受任何你喜欢的答案。而且,一匹没有名字的马肯定有一个很好的答案。不过,作为记录,这个答案出现在12秒之前。你可以按日期(现在显示为“昨天”)握住鼠标,它会显示准确的时间。你可以按日期(现在显示为“昨天”)握住鼠标,它会显示准确的时间。我真的不知道你能做到这一点。对我来说,你的答案列在“一匹马”下面,因此我认为你被“击败了”。谢谢你花时间向我指出这一点,并礼貌地这么做。A旁白。我注意到,如果字段'line1'为空,则cancat_ws函数将失败。如果同时有两个空值,也就是说,line2和line3=null。@Johnny。我几年前从亚伦·伯特兰那里学会了这个把戏。在那种情况下,他抢先找到了答案;)谢谢戈登,我感谢你的时间和帮助。一匹没有名字的马用同样的答案把你赶上了岗位,所以我接受了这个答案,但是+1是你的。@Johnny。你可以接受任何你喜欢的答案。而且,一匹没有名字的马肯定有一个很好的答案。不过,作为记录,这个答案出现在12秒之前。你可以按日期(现在显示为“昨天”)握住鼠标,它会显示准确的时间。你可以按日期(现在显示为“昨天”)握住鼠标,它会显示准确的时间。我真的不知道你能做到这一点。对我来说,你的答案列在“一匹马”下面,因此我认为你被“击败了”。谢谢你花时间向我指出这一点,并礼貌地这么做。A旁白。我注意到,如果字段'line1'为空,则cancat_ws函数将失败。如果同时有两个空值,也就是说,line2和line3=null。@Johnny。我几年前从亚伦·伯特兰那里学会了这个把戏。在那种情况下,他抢先找到了答案;)它忽略空参数,但不忽略空字符串(PG12)。它忽略空参数,但不忽略空字符串(PG12)。
SELECT concat_ws(',', line1, line2, line3, line4, city, zipcode) as cust_details
FROM addresses;
SELECT concat_ws(',', line1, nullif(line2,''), nullif(line3,''), nullif(line4,''), city, zipcode) as cust_details
FROM addresses;