postgres 中的 jsonb 列转换或使用 dbt

问题描述 投票:0回答:1

我正在尝试查看如何展平下面标题为“additionalFields”的 jsonb 列。我可以用

查询表
    SELECT "id","additionalFields" AS "additionalFields" FROM "tasks" 
where "additionalFields" @> '[{"name":"Open Cases"}]'

但是,我希望表“任务”在源数据被摄取后得到规范化,并且“additionalFields”列中的所有键都是它们自己的列并包含与它们关联的值。我听说这里可以使用“dbt”,但我什至不知道如何开始使用它。 任何帮助将不胜感激!

postgresql transformation dbt
1个回答
0
投票

方案A是使用大量的子查询或者json路径查询:

SELECT
  t."id",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == "Total Cases") .value') AS "Total Cases",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == "Open Cases") .value') AS "Open Cases",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == "Prod Cases") .value') AS "Prod Cases",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == "Sev1 Cases") .value') AS "Sev1 Cases",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == "Sev2 Cases") .value') AS "Sev2 Cases",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == " Sev1/2 Cases") .value') AS " Sev1/2 Cases",
  jsonb_path_query_first(t."additionalFields", 'strict $[*] ?(@.name == "Preview Cases") .value') AS "Preview Cases"
FROM "tasks" t
WHERE t."additionalFields" @> '[{"name":"Open Cases"}]'

要获得结果列不是

jsonb
而是其他类型,请参阅How to convert a json value to
text
, to
int
, to
float
and to
boolean
分别。


选项 B 是使用子查询将键值对数组转换为 JSON 对象(对于存储也更有用),然后将

jsonb_to_record
与所需的记录列一起使用:

SELECT t."id", fields.*
FROM "tasks" t,
LATERAL jsonb_to_record(
  SELECT jsonb_object_agg(value->>'name', value->'value')
  FROM jsonb_array_elements(t."additionalFields")
) AS fields("Total Cases" jsonb, "Open Cases" jsonb, "Prod Cases" jsonb, "Sev1 Cases" jsonb, "Sev2 Cases" jsonb, " Sev1/2 Cases" jsonb, "Preview Cases" jsonb)
WHERE t."additionalFields" @> '[{"name":"Open Cases"}]';

要获得不是

jsonb
的结果列,只需将它们声明为各自所需的原始类型即可。

© www.soinside.com 2019 - 2024. All rights reserved.