具有计数器或索引值的 Postgres JSONB_ARRAY_ELEMENTS
Postgres JSONB_ARRAY_ELEMENTS with counter or index value
假设我有这个 order
table,其中 widgets
列是一个 jsonb
数组:
order_no
小部件
50
[a,b,c]
51
[d,e,f]
select
order_no,
jsonb_array_elements_text(widgets) widget
from order;
order_no
小部件
50
一个
50
b
50
c
51
d
51
e
51
f
有没有办法让查询为 order
中的记录中的每个 jsonb 数组元素包含一个 increment/counter? (示例是从零开始的,但是从1开始查找...)
order_no
小部件
item_no
50
一个
0
50
b
1
50
c
2
51
d
0
51
e
1
51
f
2
您可以将函数调用移至FROM,然后添加WITH ORDINALITY。它基于 1,而不是基于 0,因此您必须减去 1。
select order_no, value as widget, ordinality-1 as item_no
from "order", jsonb_array_elements_text(widgets) with ordinality;
您不应使用“order”作为 table 名称,因为它是一个保留字。你可以把它放在引号里,但这仍然是个坏主意。
假设我有这个 order
table,其中 widgets
列是一个 jsonb
数组:
order_no | 小部件 |
---|---|
50 | [a,b,c] |
51 | [d,e,f] |
select
order_no,
jsonb_array_elements_text(widgets) widget
from order;
order_no | 小部件 |
---|---|
50 | 一个 |
50 | b |
50 | c |
51 | d |
51 | e |
51 | f |
有没有办法让查询为 order
中的记录中的每个 jsonb 数组元素包含一个 increment/counter? (示例是从零开始的,但是从1开始查找...)
order_no | 小部件 | item_no |
---|---|---|
50 | 一个 | 0 |
50 | b | 1 |
50 | c | 2 |
51 | d | 0 |
51 | e | 1 |
51 | f | 2 |
您可以将函数调用移至FROM,然后添加WITH ORDINALITY。它基于 1,而不是基于 0,因此您必须减去 1。
select order_no, value as widget, ordinality-1 as item_no
from "order", jsonb_array_elements_text(widgets) with ordinality;
您不应使用“order”作为 table 名称,因为它是一个保留字。你可以把它放在引号里,但这仍然是个坏主意。