从 postgres 中的 JSON 数组获取值
Get value from JSON array in postgres
我的 Postgres 数据库中有一个奇怪的 JSON 数组,没有大括号。它具有文本数据类型,所以我想我需要将其转换为 JSON。
它看起来像这样,并且可以逐行更改。
[
[
"-",
"name",
"Gates"
],
[
"-",
"name_1",
null
],
[
"-",
"name_2",
null
],
[
"-",
"na_cd",
null
],
[
"-",
"class_cd",
null
],
[
"-",
"reference",
"190955"
],
[
"-",
"lang_cd",
"en"
],
[
"-",
"uid_nr",
null
],
[
"-",
"id",
19000
],
[
"-",
"firstname",
"Bill"
],
[
"-",
"spare",
null
]
]
我需要的是找到并打印 ID(如果有的话)。在这个例子中 19000.
有人可以帮忙吗?
基本上,您应该使用 jsonb_array_elements()
两次,用于主数组和它的过滤元素(这也是一个数组)。
select value::numeric as result
from (
select elem
from the_data
cross join jsonb_array_elements(col) as main(elem)
where elem ? 'id'
) s
cross join jsonb_array_elements(elem)
where jsonb_typeof(value) = 'number'
中尝试
但是,如果你想从嵌套数组中准确获取第三个值,查询可能会更简单(注意数组元素从 0 开始索引):
select (elem->2)::numeric as result
from the_data
cross join jsonb_array_elements(col) as main(elem)
where elem ? 'id'
如果您使用的是 Postgres 12 或更高版本,并且您之后的值始终位于第三个数组元素,则可以使用 SQL/JSON 路径表达式:
select jsonb_path_query_first(the_column, '$ ? (@[*] == "id")[2]')::int
from the_table
这假定该列被定义为 jsonb
(它应该是)。如果不是,则需要转换它:the_column::jsonb
我的 Postgres 数据库中有一个奇怪的 JSON 数组,没有大括号。它具有文本数据类型,所以我想我需要将其转换为 JSON。
它看起来像这样,并且可以逐行更改。
[
[
"-",
"name",
"Gates"
],
[
"-",
"name_1",
null
],
[
"-",
"name_2",
null
],
[
"-",
"na_cd",
null
],
[
"-",
"class_cd",
null
],
[
"-",
"reference",
"190955"
],
[
"-",
"lang_cd",
"en"
],
[
"-",
"uid_nr",
null
],
[
"-",
"id",
19000
],
[
"-",
"firstname",
"Bill"
],
[
"-",
"spare",
null
]
]
我需要的是找到并打印 ID(如果有的话)。在这个例子中 19000.
有人可以帮忙吗?
基本上,您应该使用 jsonb_array_elements()
两次,用于主数组和它的过滤元素(这也是一个数组)。
select value::numeric as result
from (
select elem
from the_data
cross join jsonb_array_elements(col) as main(elem)
where elem ? 'id'
) s
cross join jsonb_array_elements(elem)
where jsonb_typeof(value) = 'number'
中尝试
但是,如果你想从嵌套数组中准确获取第三个值,查询可能会更简单(注意数组元素从 0 开始索引):
select (elem->2)::numeric as result
from the_data
cross join jsonb_array_elements(col) as main(elem)
where elem ? 'id'
如果您使用的是 Postgres 12 或更高版本,并且您之后的值始终位于第三个数组元素,则可以使用 SQL/JSON 路径表达式:
select jsonb_path_query_first(the_column, '$ ? (@[*] == "id")[2]')::int
from the_table
这假定该列被定义为 jsonb
(它应该是)。如果不是,则需要转换它:the_column::jsonb