@beduin01

Как сделать join или SELECT FROM WHERE IN из массива?

Есть две таблицы. tokens и regions. В таблице tonens есть region_id в виде json массива

Возвращает вот такой результат https://imgur.com/ZdtIlYz
https://imgur.com/5fY8Lvf

Мне нужно из таблицы regions извлечь все регионы. Пробовал так:
SELECT
	"ru_name"
FROM "public"."regions"
WHERE 
	"id" in ( SELECT json_array_elements(regions) FROM "tokens" where user_id = 5  );


Но не получается. Ругается в консоли на оператор json_array_elements.

Как мне сделать join по такому полю или SELECT FROM как я хочу?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
SELECT 
	ru_name 
FROM "tokens" 
JOIN regions ON regions.id = any (tokens.regions)
WHERE user_id = 5 ;


PostgreSQL fiddle here

with reg_ids as (
  select unnest(regions) reg_id
  from tokens where user_id = 5
) select regions.*
from reg_ids
join regions on regions.id = reg_id;


One more fiddle
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Melkij
@Melkij
PostgreSQL DBA
select ... from regions 
where id in (
    select j::int 
    from tokens cross join json_array_elements_text(regions) as j 
    where user_id = 5
);


Функции и операторы json в postgresql явно реализовывались под объекты и возможностей по работе с json массивами чисел порой не хватает.
А потому приводим вручную к числу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы