Error operator does not exist integer
Если вы получите “operator does not exist: integer || integer” error in PostgreSQL,вероятно, потому, что вы пытаетесь объединить два числа.
Если вы действительно хотите объединить два числа, самый простой способ преодолеть эту проблему – сначала привести хотя бы одно из них к строковому типу данных.
Другой способ сделать это – использовать CONCAT() функцию.
Пример ошибки
Вот пример кода, который вызывает эту ошибку:
SELECT 123 || 456;
Результат:
ERROR: operator does not exist: integer || integer
LINE 1: SELECT 123 || 456;
^
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
Решение 1
Вот быстрый способ преодолеть эту проблему:
SELECT CAST(123 AS varchar(3)) || 456;
Результат:
123456
Хотя верно, что мы могли бы преобразовать оба числа в строку, в этом нет необходимости. Пока один из операндов является строкой, оператор конкатенации канала сможет их объединить.
Решение 2
Другой способ сделать это – использовать CONCAT() функцию для выполнения конкатенации:
SELECT CONCAT(123, 456);
Результат:
123456
Эта функция работает с числами без необходимости преобразования любого из них в строку. Функция автоматически выполняет это (по умолчанию она объединяет текстовые представления своих аргументов).
Operator does not exist: integer = integer[] in a query with ANY
Я часто использовал integer = ANY(integer[]) синтаксис, но теперь ЛЮБОЙ оператор не работает. Я впервые использую его для сравнения скаляра с целым числом, возвращаемым из CTE, но я подумал, что это не должно вызвать проблем.
Мой запрос:
WITH bar AS (
SELECT array_agg(b) AS bs
FROM foo
WHERE c < 3
)
SELECT a FROM foo WHERE b = ANY ( SELECT bs FROM bar);
Когда я его запускаю, он выдает следующую ошибку:
ERROR: operator does not exist: integer = integer[]: WITH bar AS ( SELECT array_agg(b) AS bs FROM foo WHERE c < 3 ) SELECT a FROM foo WHERE b = ANY ( SELECT bs FROM bar)
Итак, что я делаю не так?
Ответ
На основе части сообщения об ошибкеoperator does not exist: integer = integer[], похоже, что bs столбец необходимо unnestотредактировать, чтобы вернуть правую часть обратно в integer, чтобы можно было найти оператор сравнения:
WITH bar AS (
SELECT array_agg(b) AS bs
FROM foo
WHERE c < 3
)
SELECT a
FROM foo
WHERE b = ANY ( SELECT unnest(bs) FROM bar);
Это приводит к выводу:
A
2
3
. ошибка имеет смысл, поскольку левое выражение представляет собой integer — столбец b, в то время как правое выражение представляет собой массив integers или integer[], и поэтому сравнение в конечном итоге имеет вид integer = integer[], в котором нет оператора, и, следовательно, приводит к ошибке.
unnestввод integer[] значения создает левые и правые выражения integers, и поэтому сравнение может продолжаться.
Измененный SQL Fiddle.
Обратите внимание: что такое же поведение наблюдается при использовании IN вместо = ANY.