【问题标题】:Postgres JSON as TEXT cannot access the needed dataPostgres JSON as TEXT 无法访问所需数据
【发布时间】:2021-09-22 11:28:03
【问题描述】:

您好,我是一名新的数据工程师,所以我还在学习。我刚开始在一家公司工作,我注意到他们将来自 API 的数据作为 JSON 提供,但他们将其作为文本存储在 Postgres 中。我认为我可以将其转换为 JSON,然后尝试从列中访问我需要的数据,但是当我运行查询时,我将所有内容都作为空值,请在下面找到数据和查询的示例。任何帮助将不胜感激:)

[
  {
    "name": "Vorwurf",
    "value": "Geschwindigkeitsverstoß",
    "type": "DROPDOWN_LIST",
    "isDefault": true,
    "isRequired": false,
    "option": "Geschwindigkeitsverstoß, Rotlichtverstoß, Abstandsverstoß, Handyverstoß, Alkohol, Anderer Tatvorwurf"
  },
  {
    "name": "Schreiben erhalten?",
    "value": "No",
    "type": "CHECKBOX",
    "isDefault": true,
    "isRequired": false
  },
  {
    "name": "Besteht Rechtsschutzversicherung",
    "value": "Yes",
    "type": "CHECKBOX",
    "isDefault": true,
    "isRequired": true
  },
  {
    "name": "Welches Schreiben liegt vor?",
    "value": "Bußgeldbescheid",
    "type": "DROPDOWN_LIST",
    "isDefault": true,
    "isRequired": false,
    "option": "Bußgeldbescheid, Anhörungsbogen, Zeugenfragebogen, Kein Schreiben"
  },
  {
    "name": "Lead Nummer",
    "value": "GM00002153",
    "type": "TEXT",
    "isDefault": true,
    "isRequired": false
  },
  {
    "name": "URL zum vorliegenden Schreiben",
    "value": null,
    "type": "TEXT",
    "isDefault": true,
    "isRequired": false
  },
  {
    "name": "Angabe Website - Wie möchten Sie uns Ihre Unterlagen senden?",
    "type": "DROPDOWN_LIST",
    "isDefault": true,
    "isRequired": false,
    "option": "Fax, E-Mail, Unterlagen bereits hochgeladen"
  }
]
With t as (select cast(custom_fields as json)
from test.matters),
CF as (SELECT custom_fields ->> 'name' as "name",
       custom_fields ->> 'isDefault' as "isDefault", 
       custom_fields ->> 'isRequired' as "isRequired",
       custom_fields ->> 'option' as "option",
       custom_fields ->> 'groups' as "groups",
       custom_fields ->> 'practice_ids' as "practice_ids",
       custom_fields ->> 'value' as "value"
from t)
select * from CF

我也尝试像这样将文本转换为 json:

SELECT custom_fields::json->>'name' FROM test.matters_che

【问题讨论】:

    标签: arrays json postgresql


    【解决方案1】:

    您的 JSON 值是一个数组,因此您需要取消嵌套数组(将每个元素变成一行)。 ->> 运算符不适用于数组,只能用于“常规”JSON 对象。

    可以使用jsonb_array_elements() 将 JSON 对象数组取消嵌套到行中。如果要在 WHERE 子句中使用列表达式,则需要将查询包装在派生表(或公用表表达式)中

    select *
    from (
      SELECT cf.item ->> 'name' as "name",
             cf.item ->> 'isDefault' as "isDefault", 
             cf.item ->> 'isRequired' as "isRequired",
             cf.item ->> 'option' as "option",
             cf.item ->> 'groups' as "groups",
             cf.item ->> 'practice_ids' as "practice_ids",
             cf.item ->> 'value' as "value"
      from your_table t
        cross join jsonb_array_elements(t.custom_fields::jsonb) as cf(item)
     ) t
     WHERE name = '....'
    

    Online Example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      相关资源
      最近更新 更多