Операторы '! =' и '<>' в postgresql - PullRequest
       4

Операторы '! =' и '<>' в postgresql

3 голосов
/ 28 февраля 2020

Согласно postgresql руководство != означает то же самое, что и <>. В действительности это не так:

psql=> select 1 where 1!=-1;
ERROR:  operator does not exist: integer !=- integer
LINE 1: select 1 where 1!=-1;
                        ^
HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.
psql=> select 1 where 1<>-1;
 ?column? 
----------
        1
(1 row)

Это ошибка или ожидаемое поведение, которое не было описано в руководстве?

Ответы [ 2 ]

2 голосов
/ 28 февраля 2020

Стандартный оператор SQL - это <>, поэтому рекомендуется придерживаться его.

Причина различий в поведении объясняется в документации :

Существует несколько ограничений на выбор имени [оператора]:

  • Имя оператора из нескольких символов не может заканчиваться + или -, если только имя также содержит хотя бы один из следующих символов:

    ~! @ #% ^ & | `?

    Например, @- - это разрешенное имя оператора, а *- - нет. Это ограничение позволяет PostgreSQL анализировать SQL -совместимые команды без пробелов между токенами.

Теперь, поскольку <> не содержит ни одного из этих символов, PostgreSQL знает, что <>- не может быть именем оператора, и нет никакой двусмысленности в разборе.

2 голосов
/ 28 февраля 2020

Вам нужно написать пробел, чтобы postgres знал, что это оператор !=, а не !=-:

select 1 != -1;

Или вы можете поместить его в скобки:

select 1!=(-1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...