如何在postgresql/plpgsql中将json转换为长格式table?

how to convert json into long format table in postgresql/plpgsql?

首先为使用图像道歉。但是我似乎无法 post 我的问题,因为我的格式似乎有问题所以我无法 post 我的问题,但我无法弄清楚哪里出了问题..

我有table这样的 table source

我想将其转换为如下结构

user_id key value
user_1 a 3
user_1 b 1
user_1 c 3
user_2 c 2
user_2 e 1
user_3 a 1
user_3 f 2

我目前使用下面的查询。但它有基于列出的 wtl_key a 到 e 的限制,而我无法列出所有可能的密钥,因为我不知道所有可能的密钥。我想查询捕获所有 json 键,可以是 aa、bb、zz 等

with wide_to_long_key AS (
select unnest(array['a','b','c','d','e']) as wtl_key
)
, data AS (
select
 user_id
 ,details::json->'a' as a
 ,details::json->'b' as b
 ,details::json->'c' as c
 ,details::json->'d' as d
 ,details::json->'e' as e
)
select
 user_id
 ,wtl_key
 ,case
   when wtl_key='a' THEN a
   when wtl_key='b' THEN b
   when wtl_key='c' THEN c
   when wtl_key='d' THEN d
   when wtl_key='e' THEN e
   when wtl_key='a' THEN a
   end as value
from
 data
CROSS JOIN
 wide_to_long_key

如果 details 列的类型是 json 你可以使用 json_each_text 或者如果是 jsonb 你可以使用 jsonb_each_text

Demo

select
  t.user_id,
  e.*
from
  test t
  cross join json_each_text(t.details) e