Error operator does not exist integer

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.

Наталья Петрова
Оцените автора
Новости города Салавата
Добавить комментарий

Adblock
detector