问题描述
这是我的虚拟设置:
CREATE TABLE containers (
id SERIAL PRIMARY KEY,positions jsonb
);
CREATE TABLE bits (
id SERIAL PRIMARY KEY,container_id integer REFERENCES containers(id) ON DELETE CASCADE ON UPDATE CASCADE,data jsonb
);
containers
中的示例行:
id positions
1 [4,2,3]
我要完成的工作是使用positions
中的containers
来指定返回位的顺序。这似乎比使用smallint position
中的bits
列更容易,该列具有0、1、2、3之类的值,并且在用户对位重新排序时必须全部更新。
本质上,我想做的是在positions
中使用ORDER BY
数组,例如(伪代码):
SELECT b.id,b.data FROM bits b,container c WHERE b.container_id = 1 ORDER BY (jsonb_array_elements(c.positions));
所需的输出将是:
id data
4 {"banner": "This is a message!"}
2 {"name": "Bob"}
3 {"playlistId": 3}
我该如何完成?我正在使用Postgres 10.7。
解决方法
您需要使用jsonb
函数。
请尝试以下操作:
select b.*
from bits b
join containers c
on c.id = b.container_id
join lateral jsonb_array_elements_text(c.positions)
with ordinality as p(id,rn)
on p.id::int = b.id
where b.container_id = 1
order by p.rn::int