Postgresql SQL语法:将多个列连接成一个列

Postgresql SQL语法:将多个列连接成一个列,postgresql,syntax,concatenation,string-formatting,Postgresql,Syntax,Concatenation,String Formatting,我正在使用PostgreSQL 9.2。我需要从名为houses: house_id | unit_number| street_number | street| street_extension| suburb | postcode | state | sale_price | sale_date | ----------+------------+-------+-------+-------+-----------------+--------+----------+-------+--

我正在使用PostgreSQL 9.2。我需要从名为houses:

 house_id | unit_number| street_number | street| street_extension| suburb | postcode | state | sale_price | sale_date |
----------+------------+-------+-------+-------+-----------------+--------+----------+-------+------------+-----------+
    1     |    2       |  17           | Rose  |     Av          |  Rye   | 3099     | VIC   | 240000     | 2003-12-02|
    2     |            |  3            | Jack  |     St          |  Rye   | 3099     | VIC   | 260000     | 2003-10-02|
在该表中的一列中,标题为地址列表:

house_id  |                 address                  | formatted_address | lat | lon | wkb_geometry | is_processed 
----------+------------------------------------------+-------------------+-----+-----+--------------+--------------
          |                                          |                   |     |     |              |  
          |                                          |                   |     |     |              |  
我的语法是

INSERT INTO address_list (house_id, address)
SELECT house_id, unit_number || '/' || street_number || ' ' || street || ' ' || street_extension || ', ' || suburb || ', ' || state || ' ' || postcode 
FROM houses;
我的语法不起作用,因为源表的unit_number字段中有一些空条目

有没有办法复制单位编号加上一个“\”如果不为空,并忽略单位编号字段和“\”如果为空


我花了几个小时寻找解决方案,但运气不佳,因此我将非常感谢您的帮助。

您可以使用
案例陈述

INSERT INTO address_list (house_id, address)
    SELECT house_id, case when unit_number is null then '' else unit_number end || '/' || street_number || ' ' || street || ' ' || street_extension || ', ' || suburb || ', ' || state || ' ' || postcode 
    FROM houses;

使用
格式
功能

insert into address_list (house_id, address)
select
    house_id,
    format(
        '%s%s %s %s, %s, %s %s', 
        unit_number || '\',
        street_number,
        street, street_extension, suburb, state, postcode
    )
from houses;
%s
标记参数位置

由于单元号中存在一些空条目,因此不起作用

如果
单位编号
是唯一可以为
空的列
,则使用
合并
,比以下操作简单得多:

如果
unit\u number
为空,分隔符
/
也会被删除。 这个原始的解决方案也是最快的

(博士后9.1+)
concat()
“带分隔符”

将在
/
之后插入空格。所以我在
/
之前加入了另一个

(博士后9.1+)

对于更复杂的情况,请使用
format()
(Postgres 9.1+),如下所示。稍微贵一点。

事实上,Agad提供的CASE语法有问题,但是上面的concat语法非常有效。非常感谢。@Mike:agad的错误是
| |“/”
必须在
ELSE
分支内。但在本例中,您不会首先使用
CASE
。。。
SELECT COALESCE(unit_number || '/', '')
    || street_number    || ' ' 
    || street           || ' ' 
    || street_extension || ', ' 
    || suburb           || ', ' 
    || state            || ' ' 
    || postcode 
FROM   houses;
SELECT concat_ws(' '
       , unit_number || ' /'
       , street_number
       , street 
       , street_extension || ',' 
       , suburb || ',' 
       , state
       , postcode
       )
FROM   houses;