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

时间:2013-08-05 11:27:01

标签: 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 |
----------+------------+-------+-------+-------+-----------------+--------+----------+-------+------------+-----------+
    1     |    2       |  17           | Rose  |     Av          |  Rye   | 3099     | VIC   | 240000     | 2003-12-02|
    2     |            |  3            | Jack  |     St          |  Rye   | 3099     | VIC   | 260000     | 2003-10-02|

在此表中的一个名为address_list:

的列中
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字段中有一些空条目。

有没有办法复制unit_number加上一个“\”如果NOT NULL,忽略unit_number字段和“\”IF NULL?

我花了几个小时寻找没有运气的解决方案,所以我非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

使用format功能

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标记参数位置。

http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER

答案 1 :(得分:0)

您可以使用case statement

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;

答案 2 :(得分:0)

  由于unit_number中的一些空条目

不起作用

COALESCE()

如果 unit_number唯一的列,可以是NULL,请使用 COALESCE ,比CASE简单得多:

SELECT COALESCE(unit_number || '/', '')
    || street_number    || ' ' 
    || street           || ' ' 
    || street_extension || ', ' 
    || suburb           || ', ' 
    || state            || ' ' 
    || postcode 
FROM   houses;

如果unit_number为空,则也会删除分隔符/。 这个原始解决方案也是最快的

concat_ws()

(Postgres 9.1+)
concat() “with separator”

SELECT concat_ws(' '
       , unit_number || ' /'
       , street_number
       , street 
       , street_extension || ',' 
       , suburb || ',' 
       , state
       , postcode
       )
FROM   houses;

但是会在/之后插入一个空格。所以我在/之前添加了另一个。

format()

(Postgres 9.1+)
对于更复杂的情况,请使用format()(Postgres 9.1+),@Clodoaldo supplied。稍贵一点。