regex - 根据 Postgres 中的分隔符替换括号并将列拆分为多行
问题描述
我有一个用';'分隔的列的表。数据如下所示:
row_id col
1 p.[D389R;D393_W394delinsRD]
2 p.[D390R;D393_W394delinsRD]
3 p.D389R
4. p.[D370R;D393_W394delinsRD]
我想在任何地方替换'[]'括号并获取文本。后来,我想将字符串拆分为';' 并连接“p”。到拆分的文本(如果不存在)并创建一个新行。
预期的输出是:
row_id new_col
1 p.D389R
2 p.D393_W394delinsRD
3 p.D390R
4 p.D393_W394delinsRD
5 p.D389R
6 p.D370R
7 p.D393_W394delinsRD
我已尝试以下查询以获得所需的输出。
SELECT *,
CASE
WHEN regexp_split_to_table(regexp_replace(col, '\[|\]', '', 'g'), E';') NOT LIKE 'p.[%'
THEN 'p.' || (regexp_split_to_table(regexp_replace(col, '\[|\]', '', 'g'), E';'))[1]
ELSE regexp_split_to_table(regexp_replace(col, '\[|\]', '', 'g'), E';')[2]
END AS new_col
FROM table;
任何建议都会非常有帮助。
解决方案
我会首先从字符串中删除常量值(p.[
和]
),然后将其取消嵌套。
with clean as (
select row_id, regexp_replace(col, '^p\.(\[){0,1}|\]$', '', 'g') as col
from the_table
)
select row_id, 'p.'|| t.c
from clean c
cross join unnest(string_to_array(c.col, ';')) as t(c)
CTE ( with ...
) 并不是必需的,但这样可以unnest(...)
保持可读性。
推荐阅读
- c - C - 为什么我的服务器套接字在一个请求后停止接收 send() 传递的数据?
- ios - 是否可以通过电子邮件中的网络链接共享 iOS 剪辑应用程序?
- php - 警告:第 72 A 行 C:\xampp\htdocs\customer_manager\update_customer_form.php 中的非法字符串偏移 'countryCode'
- regex - 用点替换空格,仅在perl中的数字之间
- performance - 我不知道为什么交易视图无法回测这段代码
- python - 3D散点图matplotlib,为绘图添加颜色不起作用?
- excel - 当目标单元格填充计算值时如何触发代码?
- nativescript - TNS Doctor - JDK 配置不正确?
- javascript - 单击链接时如何防止侧边栏关闭和打开
- crossfilter - 字符串值的日期交叉过滤器