2020年9月3日木曜日

postgres 配列に入っている値を条件に検索


PostgreSQLの2つのテーブル (users, groups)
select id, name from users;  <-usersテーブル
select id, name, user_ids from groups; <- groupsテーブル
(groupsのuser_ids はusersテーブルのid が入っているarray)

あるgroups のuser_ids に入っているデータをusers から抜き出す。

方法 1
select * from users where (select user_ids from groups where id='89') @> array[id];
users.id を配列にして、サブクエリの配列と比較。@>

方法 2
select * from users where id = any(select unnest(user_ids) from groups where id='89');
サブクエリの結果をunnest で集合にして、users.id と比較。 any の代わりに in でもOK


検索したら、この2つ方法がでてきたけど、以前どうやって扱っていたのか全く思い出せない...
こんなSQL書いてたかな? (;´∀`)
気がつけばPostgres のバージョンも12,13と上がってる。


参考
- postgresql: any on subquery returning array
- Use an array returned from a subquery as argument in WHERE clause with ANY function in outer query
- 9.18. Array Functions and Operators