[英]Postgres: split string to separate columns using numbers as delimiters
我获得了一个Postgres数据集,其中包含约2000行,其中一列是一连串的年份,而在这些年份中,维护活动是这样的:
id maintenance
1 2012- Filled holes, Painted, 2017- Nailed
3 2018- Booger removal
2 2012- Painted, 2017- Filled holes, 2018- Wallpaper
我正在尝试找到一种方法来将这些数据分为以下结构的列:
id year_1 year_1_maint year_2 year_2_maint...
1 2012 Filled holes, Painted 2017 Nailed
2 2018 Booger removal
我在想一种可能的解决方案使用如下所示的内容(但由于将其用作定界符,因此会删除年份):
select regexp_split_to_array(maintenance, '\d{4}')
from maintenance_database
where maintenance is not null;
我可以使用以下内容找到多少列:
select max(array_length(regexp_split_to_array(maintenance, '\d{4}'),1))
from maintenance_database
where maintenance is not null;
但这就是我试图获取一系列更新查询或单个查询来格式化所需数据的原因。
首先想到的是在年份后附加“特殊”字符以用作分隔符:
db=# with maintenance_database(maintenance) as (values('2012- Painted, 2017- Filled holes, 2018- Wallpaper'))
select regexp_split_to_array(regexp_replace(maintenance, '(\d{4})', '\1'||chr(1),'g'),chr(1)) from maintenance_database;
regexp_split_to_array
---------------------------------------------------------------
{2012,"- Painted, 2017","- Filled holes, 2018","- Wallpaper"}
(1 row)
这里我用regexp_replace(maintenance, '(\\d{4})', '\\1'||chr(1),'g')
“准备”维护为:
db=# with maintenance_database(maintenance) as (values('2012- Painted, 2017- Filled holes, 2018- Wallpaper'))
select regexp_replace(maintenance, '(\d{4})', '\1'||chr(1),'g') from maintenance_database;
regexp_replace
----------------------------------------------------------------
2012\x01- Painted, 2017\x01- Filled holes, 2018\x01- Wallpaper
(1 row)
进一步使用您的代码...
自然地将年用作值,您还需要加上人工分隔符:
db=# with maintenance_database(maintenance) as (values('2012- Painted, 2017- Filled holes, 2018- Wallpaper'))
select regexp_split_to_array(regexp_replace(maintenance, '(\d{4})', chr(1)||'\1'||chr(1),'g'),chr(1)) from maintenance_database;
regexp_split_to_array
--------------------------------------------------------------------
{"",2012,"- Painted, ",2017,"- Filled holes, ",2018,"- Wallpaper"}
(1 row)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.