¿Los nombres de columna de PostgreSQL distinguen entre mayúsculas y minúsculas?

157

Tengo un ejemplo de la tabla db, personsen Postgres dictadas por otro equipo que tiene un nombre de columna por ejemplo, "first_Name". Ahora estoy tratando de usar PG commander para consultar esta tabla en este nombre de columna.

select * from persons where first_Name="xyz";

Y solo regresa

ERROR: la columna "nombre_nombre" no existe

¿No estoy seguro de si estoy haciendo algo tonto o hay una solución a este problema que me estoy perdiendo?

5122014009
fuente

Respuestas:

284

Todos los identificadores (incluidos los nombres de columna) que no están entre comillas dobles se pliegan en minúsculas en PostgreSQL. Los nombres de columna que se crearon con comillas dobles y, por lo tanto, conservaron letras mayúsculas (y / u otras violaciones de sintaxis) tienen que ser comillas dobles por el resto de su vida: ( "first_Name")

Entonces, , los nombres de columna de PostgreSQL distinguen entre mayúsculas y minúsculas:

SELECT * FROM persons WHERE "first_Name" = 'xyz';

También corrija las comillas dobles incorrectas 'xyz'. Los valores (literales de cadena) están entre comillas simples .

Lee el manual aquí.

Mi consejo permanente es utilizar nombres legales en minúsculas exclusivamente para que no sea necesaria una doble cita.

Erwin Brandstetter
fuente
44
@ArtB: el estándar SQL define identificadores que no distinguen entre mayúsculas y minúsculas, tal como Postgres lo implementa. La única desviación: los identificadores sin comillas están doblados a mayúsculas en el estándar, pero pg en minúsculas todo lo que no está entre comillas dobles. (Solo relevante en casos de esquina raros.) Detalles en el manual aquí.
Erwin Brandstetter
1
@adfs: no creo que pueda explicarlo mejor de lo que ya lo hice. Para más información, siga el enlace al manual que proporcioné repetidamente.
Erwin Brandstetter
15
@adfs: En SQL, foobar, FOOBARy FooBarson el mismo identificador. Sin embargo "foobar", "FooBar"y "FOOBAR"son identificadores diferentes
a_horse_with_no_name
55
@a_horse_with_no_name sí, pero en SQL foobary FOOBARson lo mismo "FOOBAR", en potgresql FOOBARy foobaretc. son lo mismo que "foobar".
Jasen
1
@KamelMili: sugiero hacer su pregunta como pregunta , proporcionando toda la información necesaria. Los comentarios no son el lugar. Siempre puede vincular a esta respuesta para el contexto. Y puede dejar un comentario con el enlace a su pregunta relacionada aquí (también para llamar mi atención).
Erwin Brandstetter
16

Para citar la documentación :

Las palabras clave y los identificadores sin comillas no distinguen entre mayúsculas y minúsculas. Por lo tanto:

UPDATE MY_TABLE SET A = 5;

se puede escribir de manera equivalente como:

uPDaTE my_TabLE SeT a = 5;

También puede escribirlo utilizando identificadores entre comillas :

UPDATE "my_table" SET "a" = 5;

Citar un identificador lo distingue entre mayúsculas y minúsculas, mientras que los nombres sin comillas siempre se pliegan en minúsculas (a diferencia del estándar SQL donde los nombres sin comillas se pliegan en mayúsculas). Por ejemplo, los identificadores FOO, fooy "foo"se consideran el mismo por PostgreSQL, pero "Foo"y "FOO"son diferentes de estos tres y entre sí.

Si desea escribir aplicaciones portátiles, se le recomienda que siempre cite un nombre en particular o que nunca lo haga.

Eugene Yarmash
fuente
8

Los nombres de las columnas que están en mayúsculas o minúsculas deben estar entre comillas dobles en PostgresQL. Entonces, la mejor convención será seguir todos los casos pequeños con guión bajo.

aleatoriedad
fuente
2
Esto es incorrecto según la explicación dada por @ erwin-brandstetter
Michael Silver
9
¿Cómo es esto incorrecto? Si tiene nombres de columna que son mayúsculas o minúsculas, para hacer referencia a ellas debe poner el identificador entre comillas dobles.
theferrit32