如何解决PostgreSQL将Json对象转换为列
我正在使用postgresql数据库。我有一列是 jsonb数据类型。 例如,我有一个如下的json数据:
{
"test_question_number": ["1000000000","5000000000"],"question1": 0.04975124378109453,"question2": 5.077114427860696,"question3": 75621.89054726369,"question4": 3482.587064676617,"question6": 1,"question8": 0.000176068
}
您看到的是键值json数据。而且数据可能不同,因此其他已保存的json数据的键名也不相同。
现在,我想将其转换为列和行。如下所示:
---------------------------------------------------------------------------------------
| |test_question_number |question1| |question2| |question3|
---------------------------------------------------------------------------------------
| 1 | "1000000000" | 0.04975124378109453| 5.077114427860696 |75621.89054726369
------------------------ --------------------------------------------------------------
| 2 | "5000000000" | | |
---------------------------------------------------------------------------------------
我尝试了jsonb_build_object,jsonb_populate_recordset和一些功能,但是我无法解决。
谢谢。
解决方法
静态旋转解决方案可能是
WITH t AS
(
SELECT JSONB_TYPEOF(value::JSONB) AS type,js.*
FROM t
CROSS JOIN JSONB_EACH(jsdata) AS js
)
SELECT arr.*,question1,question2,question3,question4,question6,question8
FROM
(
SELECT row_id,test_question_number
FROM t
CROSS JOIN JSONB_ARRAY_ELEMENTS(value::JSONB)
WITH ORDINALITY arr(test_question_number,row_id)
WHERE type = 'array' ) AS arr
LEFT JOIN
( SELECT cnt,MAX(value::text) FILTER (WHERE key = 'question1') AS question1,MAX(value::text) FILTER (WHERE key = 'question2') AS question2,MAX(value::text) FILTER (WHERE key = 'question3') AS question3,MAX(value::text) FILTER (WHERE key = 'question4') AS question4,MAX(value::text) FILTER (WHERE key = 'question6') AS question6,MAX(value::text) FILTER (WHERE key = 'question8') AS question8
FROM (SELECT t.*,COUNT(*) OVER (PARTITION BY key) AS cnt
FROM t
WHERE type != 'array'
) AS q
GROUP BY cnt ) AS obj
ON arr.row_id = obj.cnt
按类型区分元素作为JSON对象,无论是array
还是non-array
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。