我正在尝试查看如何展平下面标题为“additionalFields”的 jsonb 列。我可以用
查询表 SELECT "id","additionalFields" AS "additionalFields" FROM "tasks"
where "additionalFields" @> '[{"name":"Open Cases"}]'
但是,我希望表“任务”在源数据被摄取后得到规范化,并且“additionalFields”列中的所有键都是它们自己的列并包含与它们关联的值。我听说这里可以使用“dbt”,但我什至不知道如何开始使用它。 任何帮助将不胜感激!
方案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
的结果列,只需将它们声明为各自所需的原始类型即可。