首页 > 解决方案 > 从 Postgres 中的字符串中提取特定长度的数量

问题描述

我正在尝试从评论中提取一组数字,例如

"on april-17 transactions numbers are 12345 / 56789"
"on april-18 transactions numbers are 56789"
"on may-19 no transactions"

它们存储在表格注释中名为“com”的列中

我的要求是获得特定长度的数字。在这种情况下,长度为 5,因此上述字符串中的 12345 和 56789 分别为 0 个五位数字或超过 2 个五位数字。

我尝试使用具有以下结果的 regexp_replace,我正在尝试找到一个有效的正则表达式或其他方法来实现它

select regexp_replace(com, '[^0-9]',' ', 'g') from comments;

                      regexp_replace                   
----------------------------------------------------
          17                          12345   56789

我希望结果只会得到

column1 | column2
12345     56789

标签: sqlpostgresqlregex-recursion

解决方案


没有简单的方法来创建获取任意数量的列的查询:它不能为一个数字创建一列,并且在下一次尝试时查询会给出两个。


对于固定的两列:

演示:db<>小提琴

SELECT 
   matches[1] AS col1,
   matches[2] AS col2
FROM ( 
    SELECT
        array_agg(regexp_matches[1]) AS matches
    FROM
        regexp_matches(
            'on april-17 transactions numbers are 12345 / 56789', 
            '\d{5}',
            'g'
        )
) s
  1. regexp_matches()每个查找在一行中给出所有查找
  2. array_agg()将所有元素放入一个数组
  3. 数组元素可以作为单独的列给出。

推荐阅读