PostgreSQL-синтаксис запроса без кавычек

у меня немного глупый вопрос. Я установил сервер БД PostgreSQL, но когда я запускаю запрос, возникает проблема с идентификатором столбца без кавычек. Я не знаю, зачем нужны кавычки вокруг идентификаторов. Мой вопрос:

SELECT vc."CAR_ID"
  FROM "VEL_CAR" vc, "VEL_DRIVER" vd, "VEL_DRIVER_CAR" vdc
WHERE vc."CAR_ID" = vdc."CAR_ID" and
      vdc."DRIVER_ID" = vd."DRIVER_ID";

моя практика от Oracle DB не использовать ". Так в Oracle:

SELECT vc.CAR_ID
  FROM VEL_CAR vc, VEL_DRIVER vd, VEL_DRIVER_CAR vdc
WHERE vc.CAR_ID = vdc.CAR_ID and
      vdc.DRIVER_ID = vd.DRIVER_ID;

когда я запускаю этот запрос без кавычек в PostgreSQL, он выдает ошибку о синтаксисе:

ERROR:  column vc.car_id does not exist
LINE 1: SELECT vc.CAR_ID

знаете ли вы почему?

--решать-- Спасибо, теперь я решил проблему! Речь шла о создании стола. Я создал объекты таблицы с помощью pgAdminIII, и я написал имя таблицы и имена столбцов в верхнем регистре. pgAdminIII создал запрос с квотами-из-за того, что имена были прописными. Поэтому запрос должен был быть написан с квотами.

3 ответов


при создании таблиц с использованием двойных кавычек имена столбцов и таблиц становятся чувствительными к регистру. Так что "car_id" - Это другое имя, чем "CAR_ID"

вам нужно создать таблицы без использования двойных кавычек, то имена не чувствительны к регистру: car_id это то же самое, что CAR_ID (кавычки отсутствуют!)

см. руководство для подробности:

http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

Edit:
Оракул!--16-->поведение точно так же. Единственное отличие заключается в том, что Oracle хранит имена в верхнем регистре, а Postgres-в Нижнем. Но поведение при использовании кавычек идентично.


с документация Postgres :

цитирование идентификатора также делает его чувствительным к регистру, тогда как имена без кавычек всегда складываются в нижний регистр. Например, идентификаторы FOO, foo и "foo" считаются одинаковыми PostgreSQL, но "Foo" и "FOO" отличаются от этих трех и друг от друга. (Складывание некотируемых имен в нижний регистр в PostgreSQL несовместимо со стандартом SQL, в котором говорится, что некотируемые имена должны сложите в верхний регистр. Таким образом, foo должно быть эквивалентно "FOO", а не "foo" в соответствии со стандартом. Если вы хотите писать портативные приложения, вам рекомендуется всегда цитировать определенное имя или никогда не цитировать его.)


мне кажется, что таблица vc не имеет столбца с именем car_id. Вы уверены, что он там? Do \d vel_car чтобы увидеть структуру таблицы.

котировки являются необязательными, и вы можете пропустить их.