postgresql 9.1.3: проблемы "оператор не уникален" - PullRequest
2 голосов
/ 05 марта 2012

Рассмотрим следующие ошибки запроса:

db=# select 'test' || 123;
ERROR:  operator is not unique: unknown || integer
LINE 1: select 'test' || 123;
                      ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

db=# select 'test'::text || 123;
ERROR:  operator is not unique: text || integer
LINE 1: select 'test'::text || 123;
                            ^
HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.

Теперь в PGAdmin, в моем узле Приведения для БД, у меня определено 13 из них, одна из которых:

CREATE CAST (integer AS text)
  WITH FUNCTION text(integer)
  AS IMPLICIT;

Когда мы перешли к PG 9.1, я воссоздал неявные приведения, следуя методу , описанному здесь .

Мне интересно, действительно ли я создал дублирующие операторы, и если да, то как мне это сделать?идти на уборку?Если нет, то почему я получаю такую ​​ошибку?Это довольно прямолинейный актерский состав.

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 марта 2012

Я попытался добавить тот же состав, и он дает мне ту же ошибку в 9.1.2.Я также заметил, что первый комментарий в этом блоге (от 24 февраля 2009 г.) сообщает об этой ошибке.

Это может быть связано со следующим комментарием в руководстве:

Примечание:До PostgreSQL 8.3 эти функции также принимали значения нескольких нестроковых типов данных в молчании из-за наличия неявных приведения этих типов данных к тексту.Эти принуждения были удалены, потому что они часто вызывали удивительное поведение. Однако оператор конкатенации строк (||) по-прежнему принимает нестроковый ввод , если хотя бы один ввод имеет строковый тип.

Я думаю, вы создаетедублирующий оператор путем добавления неявного приведения.Целое число может быть приведено к тексту и использовать text || text или нет и использовать text || integer.Глядя в таблицы, я думаю, что второй может быть text || anynonarray, который нельзя отбросить.

Короче говоря, единственный способ исправить это - использовать явное приведение при использовании ||оператор ИЛИ отбрасывает созданное вами неявное приведение и использует явное приведение повсюду.

0 голосов
/ 26 июля 2014

столкнулся с такой же проблемой, где для решения одной ошибки мне нужно добавить те старые неявные преобразования, но это вызвало ошибку где-то еще, например - SELECT 1 || '/%'; запрос выдаст ошибку неуникального оператора, я должен был отбросить целое число при приведении текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...