代码之家  ›  专栏  ›  技术社区  ›  John1985

regexp_匹配,每行数组

  •  1
  • John1985  · 技术社区  · 3 年前

    在PostgreSQL中,我有一个如下表。

    |    id    |     mycolumn   |
    | -------- | -------------- |
    | 1        | /1/2/8/        |
    | 2        | /1/40/22/11/   |
    | 3        | /1/15/35/      |
    

    我试图得到数组中每一行的所有数字。 到目前为止,我得出了以下结论:

        SELECT array_agg(matchx)
        FROM (
            SELECT unnest(regexp_matches(mycolumn,
                                         '[0-9]+',
                                         'g')) matchx
            FROM mytable
        ) x
    

    我想要的是:

    |  array_agg   |
    | ------------ |
    | {1,2,8}      |
    | {1,40,22,11} |
    | {1,15,35}    |
    

    我得到的是:

    |        array_agg              |
    | ----------------------------- |
    | {1,2,8,1,40,22,11,1,15,35}    |
    

    如何获得每行的数组?

    1 回复  |  直到 3 年前
        1
  •  4
  •   a_horse_with_no_name    3 年前

    无需取消测试,只需直接将其转换为数组:

    select id, string_to_array(trim(both '/' from mycolumn), '/')
    from mytable;
    

    这个 trim() 是必需的,否则数组中会有空元素。


    如果您在聚合时分组,您最初的方法会起作用:

    SELECT id, array_agg(matchx)
    FROM (
        SELECT id, 
               unnest(regexp_matches(mycolumn,'[0-9]+','g')) matchx
        FROM mytable
    ) x
    group by id;