Почему не выводит строки при корректном запросе postgre?

select * from proxy where user='40'
Есть такой sql запрос, атрибут user интегер. Где я ошибся? Если кавычки убираю, то сыпет ошибку:
ERROR:  operator does not exist: name = integer
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

А с кавычками выводит "ничего" т.е. ноль полей.
Где я ошибся?
  • Вопрос задан
  • 15605 просмотров
Решения вопроса 2
Melkij
@Melkij
PostgreSQL DBA
А с кавычками выводит "ничего" т.е. ноль полей.

С какими именно?

user='40'
'user'='40'
"user"='40'

Это три абсолютно различных условия, выполняющих совершенно разные вещи.

user - зарезервированное слово по требованию стандарта. По стандарту не уверен что обозначает в контексте where, надо искать (может как часть create user и подобных только зарезервирован), а в postgresql обозначает имя текущего пользователя. Имеет тип name, что и провоцирует ошибку.
Т.е. первое условие в принципе не имеет никакого отношения к каким-либо пользовательским таблицам.

'user' - просто текстовая константа. Никто не мешает в условии сравнивать одну константу с другой, where 1=1 в некоторых query builder отсюда же.

"user" - обращение к объекту, игнорируя зарезервированные слова. То есть если у вас в таблице proxy есть поле user - то запрос должен быть записан как
select * from proxy where "user"='40'

Но общая практика - лучше не надо использовать зарезервированные слова в качестве идентификаторов.
Ответ написан
sergey-gornostaev
@sergey-gornostaev Куратор тега PostgreSQL
Седой и строгий
user - зарезервированное слово, вы не можете назвать им таблицу или поле.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы