处理JSON列并拆分值

时间:2019-07-10 13:04:58

标签: json postgresql

我的一个Postgres表中有以下文本作为TEXT数据类型:

[
 {"type": "text", "values": ["General"], "valueType": "string", "fieldType": "text", "value": ["General"], "customFieldId": "ee", "name": "customer_group"}, 
 {"type": "text", "values": ["Vienna"], "valueType": "string", "fieldType": "text", "value": ["Vienna"], "customFieldId": "eU", "name": "customer_city"},
 {"type": "text", "values": ["Mario"], "valueType": "string", "fieldType": "text", "value": ["Mario"], "customFieldId": "eZ", "name": "first_name"},
 {"type": "text", "values": ["2019-06-30"], "valueType": "date", "fieldType": "text", "value": ["2019-06-30"], "customFieldId": "ea", "name": "created_at_date"}
]

我需要将此TEXT字段的值拆分为列和行。为此,我将TEXT列转换为JSON,如下所示:

SELECT CAST( "customFieldValues" as JSON) "customFieldValues" FROM fr.contacts

但是当我尝试操作此JSON值时,结果为NULL。

WITH  CTE AS(SELECT CAST( "customFieldValues" as JSON) "customFieldValues" FROM fr.contacts
)
 SELECT
   "customFieldValues" ->>'customer_city' as dd
 FROM CTE

有人对此有任何建议吗?如何获取列名及其在行中的值。我想基于此数据创建一个表。

任何建议都会有很大帮助。

以下是预期结果,

customer_group   customer_city     first_name       created_at_date
General          Vienna            Mario            2019-06-30

1 个答案:

答案 0 :(得分:1)

免责声明:目前尚不清楚:

  • 为什么会有一个元素values和一个value?有什么区别?
  • 为什么这些元素是数组?

step-by-step demo:db<>fiddle

SELECT 
    MAX(value) FILTER (WHERE column_name = 'customer_group') AS customer_group,
    MAX(value) FILTER (WHERE column_name = 'customer_city') AS customer_city,
    MAX(value) FILTER (WHERE column_name = 'first_name') AS first_name,
    MAX(value) FILTER (WHERE column_name = 'created_at_date') AS created_at_date
FROM (
    SELECT
        elems ->> 'name' AS column_name,
        elems -> 'value' ->> 0 AS value,
        data
    FROM
        mytable,
        json_array_elements(data::json) elems
) s
GROUP BY data
  1. 使用::json将文本投射到json
  2. 扩展JSON数组:每个元素用json_array_elements()排一行
  3. 获取值:-> 'value'获取数组,->> 0获取第一个数组元素(此处是唯一的元素)的文本表示形式
  4. 获取列:->> 'name'获取列名称的文本表示形式
  5. 带有FILTER子句的经典数据透视算法(将行转换为列)。