Postgres:将 JSON 数组元素扩展为带有索引的值?

Tom*_*ips 6 postgresql json

我有一个包含 JSON 数组的列的表。举个例子:

with example as (
    select '["a", "b"]'::jsonb as col
    union select ('["c", "d", "e"]'::jsonb) as col
)
select col from example
Run Code Online (Sandbox Code Playgroud)

返回:

col
["a", "b"]
["c", "d", "e"]
Run Code Online (Sandbox Code Playgroud)

我可以用 jsonb_array_elements将每个数组扩展为行:

select jsonb_array_elements(col) from example
Run Code Online (Sandbox Code Playgroud)

返回:

jsonb_array_elements
"a"
"b"
"c"
"d"
"e"
Run Code Online (Sandbox Code Playgroud)

我想要每个数组元素的索引以及元素本身(有点像 Python 的 enumerate),如下所示:

jsonb_array_elements    array_index
"a"                     1
"b"                     2
"c"                     1
"d"                     2
"e"                     3
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我的应用程序具有只读访问权限,因此我无法创建函数。

小智 6

使用with ordinality

with example (col) as (
  values 
    ('["a", "b"]'::jsonb),  
    ('["c", "d", "e"]'::jsonb)
)
select t.*
from example, jsonb_array_elements(col) with ordinality as t(e,idx)
Run Code Online (Sandbox Code Playgroud)

返回:

with example (col) as (
  values 
    ('["a", "b"]'::jsonb),  
    ('["c", "d", "e"]'::jsonb)
)
select t.*
from example, jsonb_array_elements(col) with ordinality as t(e,idx)
Run Code Online (Sandbox Code Playgroud)

with ordinality仅当您在子句中使用 set 返回函数时才可以使用from,无论如何,强烈建议您这样做。