2011-06-10 26 views
6

Tengo una pequeña pregunta tonta. He instalado un Servidor de PostgreSQL DB, pero cuando ejecuto la consulta, hay un problema con el identificador de columna sin comillas. No sé por qué son necesarias las comillas para los identificadores. Mi consulta:PostgreSQL - sintaxis de consulta sin comillas

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"; 

Mi práctica de base de datos Oracle es no utilizar" Así que en 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; 

Cuando ejecuto esta consulta sin comillas en PostgreSQL arroja error acerca de la sintaxis:

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

¿sabe por qué?

--SOLVED-- ¡Gracias, ahora he resuelto el problema! Fue sobre la creación de mesa. Creé objetos de tabla usando pgAdminIII y escribí el nombre de la tabla y los nombres de columna en mayúscula. pgAdminIII creó una consulta con cuotas, debido a que los nombres estaban en mayúscula. Entonces, la consulta debe escribirse con cuotas.

+0

Postgres tiene un manejo peculiar de los nombres de tabla y campo con respecto a la distinción entre mayúsculas y minúsculas. –

+2

@ypercube: no es "peculiar" seguir el estándar SQL (y se comporta como Oracle, DB2, Firebird, H2, Derby, ...) –

+1

@veselej En una nota al margen: quota = cantidad de un recurso (espacio en disco, utilización de la CPU, etc.) otorgado a un usuario; quote = cita, cadena entre comillas (', "), por lo que realmente está hablando de comillas y no de cuotas aquí :-) –

Respuesta

10

Al crear tablas con comillas dobles, los nombres de columnas y tablas se distinguen entre mayúsculas y minúsculas. Así "car_id" es un nombre diferente que "CAR_ID"

Es necesario crear las tablas sin utilizar comillas dobles, a continuación, los nombres no son sensibles a mayúsculas: (tenga en cuenta las cotizaciones que faltan) car_id es lo mismo que CAR_ID

Ver el manual para más detalles:

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

Editar:
Oracle se comporta de la misma manera. La única diferencia es que Oracle almacena nombres en mayúsculas y Postgres los almacena en minúsculas. Pero el comportamiento al usar comillas es idéntico.

0

Me parece que la tabla vc no tiene una columna llamada car_id. ¿Estás seguro de que está allí? Haz \d vel_car para ver la estructura de la tabla.

Las comillas son opcionales y, por lo general, puede omitirlas.

1

De Postgres documentation:

Citando un identificador también hace que sea mayúsculas y minúsculas, mientras que nombres no cotizados siempre se pliegan a minúsculas. Por ejemplo, los identificadores FOO, foo y "foo" se consideran los mismos por PostgreSQL, pero "Foo" y "FOO" son diferentes de estos tres y de cada uno. (El plegado de los nombres no citados a minúsculas en PostgreSQL es incompatible con el estándar SQL, que dice que los nombres no citados deben doblarse a mayúsculas. Por lo tanto, foo debería ser equivalente a "FOO" y no a "foo" según el estándar. Si desea escribir aplicaciones portátiles, se recomienda siempre citar un nombre particular o nunca citarlo).

Cuestiones relacionadas