Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
774 views
in Technique[技术] by (71.8m points)

postgresql - Postgres, How to do a LEFT JOIN on JSONB array integer

I have a table "Photos" that references a list of persons shown in the photo. The persons are referenced in a JSONB column named "persons" containing a json like in this format [1,2,3,4,5]

CREATE TABLE Photos (
  id INTEGER PRIMARY KEY,
  name TEXT,
  persons JSONB
);

CREATE TABLE Person(
  id INTEGER PRIMARY KEY,
  name TEXT
);

I want to do a LEFT JOIN but I can't figure out how. Something like this

SELECT * FROM photos p LEFT JOIN person ON p.persons = person.id

Any idea how to do it?

question from:https://stackoverflow.com/questions/65835448/postgres-how-to-do-a-left-join-on-jsonb-array-integer

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Unnest the array then you can join:

select ph.id, ph.name, pe.*
from photos ph
  left join jsonb_array_elements(ph.persons) as p(pid) on true
  left join person pe on pe.id = p.pid::int

The first left join expands all array elements to rows. A left join is required, otherwise photos with an empty persons array would not show up. Then you can join against the person table.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...