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

Demo

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...