postgresql:“ ...哪里X IN <数组类型列值>”语法?

时间:2019-08-01 19:17:38

标签: postgresql

在where子句中使用数组列的值时遇到问题。复制的完整示例:

create type public.genre_type as enum ('scifi', 'fantasy', 'crime', 'horror', 'classics');
create table public.reader_profile(
    id integer,
    fave_genres genre_type ARRAY
);
create table public.books(
    id serial not null,
    title text,
    genre_type public.genre_type
);
insert into public.reader_profile(id, fave_genres) values (1, array['crime', 'horror']::public.genre_type[]);
insert into public.reader_profile(id, fave_genres) values (2, array['fantasy', 'scifi']::public.genre_type[]);
insert into public.reader_profile(id, fave_genres) values (3, array['scifi', 'classics']::public.genre_type[]);
insert into public.books(title, genre_type) values ('gone with the wind', 'classics');
insert into public.books(title, genre_type) values ('Foundation', 'scifi');
insert into public.books(title, genre_type) values ('Dune', 'scifi');

-- THE FOLLOWING FAILS!!!
select * from public.books
  where genre_type in (
      select fave_genres from public.reader_profile where id = 2
  );

我已经尝试过...where genre_type = ANY()和其他...where genre_type <@ ()的其他堆栈溢出答案,但是我什么也做不了!似乎内部查询(有效)正在作为数组类型而不是值列表或其他内容返回。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:1)

我可以建议改用联接吗?

select * 
from public.books b
join public.reader_profile fg on b.genre_type = ANY(rp.fave_genres) and fg.id = 2

答案 1 :(得分:1)

我同意@Hogan的观点,它对于JOIN似乎可行,但是您要查找的语法如下:

SELECT *
FROM books
WHERE genre_type = ANY(ARRAY(SELECT fave_genres FROM reader_profile WHERE id = 2))
;

Demo