Postgresql SQL语法:将多个列连接成一个列
我正在使用PostgreSQL 9.2。我需要从名为houses: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 | ----------+------------+-------+-------+-------+-----------------+--------+----------+-------+--
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;