Postgresql 在另一个查询的选择中查询jsonb数组

Postgresql 在另一个查询的选择中查询jsonb数组,postgresql,postgresql-10,Postgresql,Postgresql 10,我有一个带有列favorites的用户表,该列是jsonb favorites: [ { "id_doc:": 9, "type": "post" }, { "id_doc": 10, "type": "post" }

我有一个带有列favorites的用户表,该列是jsonb

favorites:
 [
        {
            "id_doc:": 9,
            "type": "post"
        },
        {
            "id_doc": 10,
            "type": "post"
        }
 ]
我还有另外一个表POST,我想按id进行查询,这个id必须在favorites用户的id\u doc字段中

select * from posts where id in (select favorites -> id_doc from users )
这是模式

CREATE TABLE dev.users
(
    id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    firstname character varying COLLATE pg_catalog."default" NOT NULL,
    lastname character varying COLLATE pg_catalog."default" NOT NULL,
    email character varying COLLATE pg_catalog."default" NOT NULL,
    password character varying COLLATE pg_catalog."default" NOT NULL,
    favorites jsonb[],
    CONSTRAINT users_pkey PRIMARY KEY (id),
    CONSTRAINT email_key UNIQUE (email)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE dev.users
    OWNER to postgres;


CREATE TABLE dev.posts
(
    id integer NOT NULL DEFAULT nextval('dev.posts_id_seq'::regclass),
    title character varying COLLATE pg_catalog."default" NOT NULL,
    userid integer NOT NULL,
    description character varying COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT posts_pkey PRIMARY KEY (id)
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE dev.posts
    OWNER to postgres;
我该怎么做?
谢谢

还有其他方法可以做到这一点,但为了清晰起见,我更喜欢使用CTE。请让我知道在评论中,如果你有什么问题,这是什么

with elements as (
  select jsonb_array_elements(favorites) as favitem
    from users
), fav_ids as (
  select distinct (favitem->>'id_doc')::int as id_doc
    from elements
)
select p.*
  from posts p
  join fav_ids f on f.id_doc = p.id
;
更新 由于列被定义为
jsonb[]
而不是
json
,因此我们需要
unest()
而不是
jsonb\u array\u elements()


有其他方法可以实现这一点,但为了清晰起见,我更喜欢使用CTE。请让我知道在评论中,如果你有什么问题,这是什么

with elements as (
  select jsonb_array_elements(favorites) as favitem
    from users
), fav_ids as (
  select distinct (favitem->>'id_doc')::int as id_doc
    from elements
)
select p.*
  from posts p
  join fav_ids f on f.id_doc = p.id
;
更新 由于列被定义为
jsonb[]
而不是
json
,因此我们需要
unest()
而不是
jsonb\u array\u elements()


我有个错误。jsonb_数组_元素(jsonb[])没有exist@simo9900请更新您的问题以显示表架构。我们必须以不同于
jsonb
的方式对待
jsonb[]
列。我将更新我的答案。我有一个错误。jsonb_数组_元素(jsonb[])没有exist@simo9900请更新您的问题以显示表架构。我们必须以不同于
jsonb
的方式对待
jsonb[]
列。我会更新我的答案。