我正在使用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?
我花了几个小时寻找没有运气的解决方案,所以我非常感谢任何帮助。
答案 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。稍贵一点。