Вкратце: 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[]