ОШИБКА: оператор не существует: bigint = bigint[]

#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. Я пытался использовать его, но, тем не менее, он выдает мне ту же ошибку.