#sql #postgresql
#sql #postgresql
Вопрос:
SQL-запрос
SELECT type from types where id in (SELECT type_ids from user where id=1)
Здесь подзапрос
SELECT type_ids from user where id=1
возвращает значение типа bigint[].
Как я могу это решить?
Ответ №1:
Вы можете использовать exists
, если я правильно понимаю:
select t.type
from types t
where exists (select 1
from user u
where u.id = 1 and
t.id = any (u.type_ids)
);
Или, проще говоря, a join
должен делать то, что вы хотите:
select t.type
from types t join
users u
on t.id = any(u.type_ids)
where u.id = 1;
Хотя это может возвращать дубликаты, если type_ids
имеет дубликаты.
Комментарии:
1. Я думаю
= ANY
, что здесь ключевым является ключ, а неexists
илиjoin
; подзапрос, скорее всего, возвращает одну строку.
Ответ №2:
Существует небольшая разница между списком значений и значением массива, а также операциями, которые вы можете использовать для каждого.
IN
Оператор сравнивает значение со списком значений, например, вложенным запросом, который возвращает несколько строк. Поэтому было бы уместно, чтобы что-то вроде SELECT type from types where id in (SELECT type_id from user)
type_id
было одиночным bigint
, но вложенный запрос возвращал несколько строк.
Как говорится в документации, id in (a, b, c)
эквивалентно id=a OR id=b OR id=c
, поэтому вы получаете сообщение об ошибке: Postgres пытается вычислить id = (SELECT type_ids from user where id=1)
, но не знает, как сравнить a bigint
с массивом bigints ( bigint[]
) .
= ANY
Вместо этого оператор сравнивает значение с одним значением массива, что и есть здесь: SELECT type_ids from user where id=1
возвращает одну строку, но значение в этой строке является массивом ( bigint[]
значением).
Итак, один из способов написания запроса:
SELECT type from types where id = ANY (SELECT type_ids from user where id=1)
Комментарии:
1. Я пытался использовать его, но, тем не менее, он выдает мне ту же ошибку.