Postgresql IN error: оператор не существует целое число = целое число [] - PullRequest
0 голосов
/ 11 июня 2018

Этот запрос WHERE ANY в Nestjs / Express работает нормально:

const sql = 'SELECT * FROM members WHERE '+ integerId + ' = ANY(skill_id_array)';
const membersBySkill = await this.entityManager.query(sql

);

Этот запрос WHERE IN завершается неудачно с сообщением об ошибке заголовка этого сообщения:

const sql = 'SELECT * FROM members WHERE '+ integerId + ' IN (skill_id_array)';
const membersBySkill = await this.entityManager.query(sql);

Я понимаю, что SQL - это IN, и ЛЮБОЙ должен быть почти одинаковый запрос с почти одинаковыми результатами.

integerId is a var integer such as 2.
skill_id_array in Postgres looks like this: {1,2,5}

Почему происходит эта ошибка?Я ищу с целым числом в столбце целочисленных массивов.

1 Ответ

0 голосов
/ 11 июня 2018

Вкратце: in() нужен список скаляров, в то время как any() нужен выражение массива.

За документация:

выражениеIN (значение [, ...])

В правой части приведен список скалярных выражений в скобках.

Пример:

where integerid in (1, 2, 5)

оператор выражения ANY (выражение массива)

Правая часть - это выражение в скобках, которое должно привести кзначение массива

Пример:

where integerid = any ('{1, 2, 5}');

Поскольку

skill_id_array в Postgres выглядит следующим образом: {1,2,5}

, поэтому при передаче в запрос выражение заключено в одинарные кавычки, и вы можете использовать его с any().Если вы сделаете то же самое с in(), вы, очевидно, получите неверный синтаксис:

where integerid in ('{1, 2, 5}');

ERROR:  invalid input syntax for integer: "{1, 2, 5}"   

или, если ваш ORM использует автоматическое приведение:

where integerid in ('{1, 2, 5}'::int[]);

ERROR:  operator does not exist: integer = integer[]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...