1

首先为使用图像道歉。但是我似乎无法发布我的问题,因为我的格式似乎有问题,所以我无法发布我的问题,但我不知道出了什么问题..

我有这样的 表源

我想将其转换为如下结构

用户身份 钥匙 价值
用户_1 一个 3
用户_1 b 1
用户_1 C 3
用户_2 C 2
用户_2 e 1
用户_3 一个 1
用户_3 F 2

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

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
4

1 回答 1

1

如果详细信息列的类型是 json 你可以使用json_each_text或者如果是 jsonb 你可以使用jsonb_each_text

演示

select
  t.user_id,
  e.*
from
  test t
  cross join json_each_text(t.details) e
于 2022-01-23T14:30:39.840 回答