问题描述
如何解析 JSON
{
"35673": [
"234","357","123"
],"34566": [
"333","456","789"
]
}
到Greenplum表,格式1键1值?
解决方法
在您的基本示例中,没有 json 嵌套对象,没有 json 对象数组,并且所有对象值都是字符串数组。因此,在这些假设中,您可以将 json_path_query
函数与 jsonpath 运算符 keyvalue()
一起使用,以便将 json 对象拆分为一组键/值,然后使用 json_array_elements
函数,以便拆分结果值,这些值系统地为一维数组:
SELECT j->>'key' AS Key,json_array_elements(j->'value')->>0 AS Value
FROM json_path_query (your_json_object_here,'$.keyvalue()') AS j
您的示例的输出是:
Key Value
34566 333
34566 456
34566 789
35673 234
35673 357
35673 123
所有这些功能都可以应用于 jsonb 类型,它比 json 类型更受欢迎,参见 manual :
"json 和 jsonb 数据类型接受几乎相同的一组值作为输入。主要的实际区别是效率之一。 json 数据类型存储输入文本的精确副本,其中 处理函数必须在每次执行时重新解析;而jsonb数据 以分解的二进制格式存储,使其速度稍慢 由于增加的转换开销而输入,但明显更快 过程,因为不需要重新解析。 jsonb 也支持索引, 这可能是一个显着的优势。”
如果您的 json 结构与嵌套对象或对象数组更复杂,您将不得不调整 FROM 子句中的函数。 如果您的对象值不是系统的字符串数组,您将不得不调整应用于生成的 json 值字段的函数。