繁体   English   中英

Postgres:使用数字作为分隔符将字符串拆分为单独的列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM