如何从 Postgres 中的 json 列中提取键和值?
How to extract key and value from json column in Postgres?
我想使用 Postgresql 添加从 json 列提取的键值对到 table。
我有一个 items_table,在 json 中有一个带有 uid 和数据列的多对。初始 table 看起来像:
uid | data
1 | {"item1":"string1", "item2":"string2"}
2 | {"item2":"string3", "item5":"string1", "item7":"string5"}
3 | {"item1":"string3", "item4":"string1", "item6":"string8", "item5":"string5"}
4 | {"item1":"string4"}
...
因此,一些 items/strings 可以重复,字段长度也可以变化。
我尝试应用 jsonb_object_keys,在文档中提到,但是我发生了错误。
select jsonb_object_keys(data)
from items_table;
错误:函数jsonb_object_keys(字符变化)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换.
我想通过以下方式获得 table 结果,以按项目和字符串拆分,扩展 uid 列:
uid | items | strings
1 | item1 | string1
1 | item2 | string2
2 | item2 | string3
2 | item5 | string1
2 | item7 | string5
3 | item1 | string3
3 | item4 | string1
3 | item6 | string8
3 | item5 | string5
4 | item1 | string4
如何实现上述输出?
您应该能够提取键,然后提取值:
select key, v.j->key
from (values (1, '{"item1":"string1", "item2":"string2"}'::jsonb),
(2, '{"item2":"string3", "item5":"string1", "item7":"string5"}'::jsonb)
) v(id, j) cross join lateral
jsonb_object_keys(v.j) as key;
Here 是一个 db<>fiddle.
您可以使用 json_each_text()
方法轻松地将 jsonb
类型的列拆分为两个单独的列:
select uid, (js).key as items, (js).value as strings
from
(
select uid, jsonb_each_text(data) as js
from tab
) q
或更直接地使用 cross join
:
select uid, js.items, js.value as strings
from tab
cross join jsonb_each_text(data) as js(items)
我想使用 Postgresql 添加从 json 列提取的键值对到 table。
我有一个 items_table,在 json 中有一个带有 uid 和数据列的多对。初始 table 看起来像:
uid | data
1 | {"item1":"string1", "item2":"string2"}
2 | {"item2":"string3", "item5":"string1", "item7":"string5"}
3 | {"item1":"string3", "item4":"string1", "item6":"string8", "item5":"string5"}
4 | {"item1":"string4"}
...
因此,一些 items/strings 可以重复,字段长度也可以变化。
我尝试应用 jsonb_object_keys,在文档中提到,但是我发生了错误。
select jsonb_object_keys(data)
from items_table;
错误:函数jsonb_object_keys(字符变化)不存在提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换.
我想通过以下方式获得 table 结果,以按项目和字符串拆分,扩展 uid 列:
uid | items | strings
1 | item1 | string1
1 | item2 | string2
2 | item2 | string3
2 | item5 | string1
2 | item7 | string5
3 | item1 | string3
3 | item4 | string1
3 | item6 | string8
3 | item5 | string5
4 | item1 | string4
如何实现上述输出?
您应该能够提取键,然后提取值:
select key, v.j->key
from (values (1, '{"item1":"string1", "item2":"string2"}'::jsonb),
(2, '{"item2":"string3", "item5":"string1", "item7":"string5"}'::jsonb)
) v(id, j) cross join lateral
jsonb_object_keys(v.j) as key;
Here 是一个 db<>fiddle.
您可以使用 json_each_text()
方法轻松地将 jsonb
类型的列拆分为两个单独的列:
select uid, (js).key as items, (js).value as strings
from
(
select uid, jsonb_each_text(data) as js
from tab
) q
或更直接地使用 cross join
:
select uid, js.items, js.value as strings
from tab
cross join jsonb_each_text(data) as js(items)