从 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'

Db<>Fiddle.

中尝试

但是,如果你想从嵌套数组中准确获取第三个值,查询可能会更简单(注意数组元素从 0 开始索引):

select (elem->2)::numeric as result
from the_data
cross join jsonb_array_elements(col) as main(elem)
where elem ? 'id'

Db<>Fiddle.

如果您使用的是 Postgres 12 或更高版本,并且您之后的值始终位于第三个数组元素,则可以使用 SQL/JSON 路径表达式:

select jsonb_path_query_first(the_column, '$ ? (@[*] == "id")[2]')::int
from the_table

这假定该列被定义为 jsonb(它应该是)。如果不是,则需要转换它:the_column::jsonb