0

我正在使用 PostgreSQL 9.2。我需要从这个标题为房屋的表格中复制地址(分成多列):

 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 字段和“\”如果 NULL?

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

4

3 回答 3

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

于 2013-08-05T11:44:08.053 回答
0

由于 unit_number 中有一些空条目而不起作用

COALESCE()

如果 unit_number唯一可以使用的列,则NULL使用COALESCECASE

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

如果unit_number为 null,则分隔符/也将被删除。这种原始的解决方案也是最快的。

concat_ws()

(Postgres 9.1+)
concat() “带分隔符”

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

不过,会在 之后插入一个空格/。所以我之前包括了另一个/

format()

(Postgres 9.1+)
对于更复杂的情况,请使用format()(Postgres 9.1+),正如@Clodoaldo 提供的那样。稍微贵一点。

于 2013-08-05T13:39:17.587 回答
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;
于 2013-08-05T11:32:42.787 回答