将一列拆分为多列(数量和名称未知)

utugiqy6  于 2021-07-27  发布在  Java
关注(0)|答案(1)|浏览(306)

假设我有一张这样的table:
例子

ID    Name    Something    Params
-----------------------------------------
1     First   A241FRT      P1=12, P2=One
2     Second  G924PEM      P1=19
3     Third   L9449TY      P1=94, P2=Two

我需要分栏 Params 变成多个。所以我需要得到这样的东西:
预期结果

ID    Name    Something    P1    P2
-----------------------------------------
1     First   A241FRT      12    One
2     Second  G924PEM      19
3     Third   L9449TY      94    Two

我不知道额外列的名称,因为它是数量。
我不太擅长sql,所以我非常需要你的帮助,谢谢大家

8zzbczxx

8zzbczxx1#

我将把params转换成json值,然后提取键:

select id, name, something, 
       params ->> 'P1' as p1,
       params ->> 'P2' as p2
from (
  select id, 
         name, 
         something, 
         concat('{', 
                  regexp_replace(regexp_replace(params, '(P[0-9])=', '"\1":', 'gi'), 
                                 ':(\w+)', ':"\1"', 'gi'), 
                '}')::jsonb
  from the_table
) t

如果您经常需要,那么创建一个将“params”转换为json表示的函数可能是有意义的:

create function params_to_json(p_params text)
  returns jsonb
as
$$
  select jsonb_object_agg(split_part(p, '=', 1), split_part(p, '=', 2))
  from regexp_split_to_table(p_params, ',\s*') as t(p)
$$
language sql
stable
;

然后你可以这样使用它:

select id, name, something, 
       params_to_json(params) ->> 'P1' as p1,
       params_to_json(params) ->> 'P2' as p2
from data

该函数对于未知键更为灵活,因为它只假设键/值对由 , 键和值之间用 =

相关问题