Les noms de colonnes PostgreSQL sont-ils sensibles à la casse?

157

J'ai une table de base de données, personsà Postgres, transmise par une autre équipe qui a un nom de colonne, par exemple "first_Name". J'essaie maintenant d'utiliser le commandant PG pour interroger cette table sur ce nom de colonne.

select * from persons where first_Name="xyz";

Et ça revient juste

ERREUR: la colonne "first_Name" n'existe pas

Je ne sais pas si je fais quelque chose de stupide ou existe-t-il une solution de contournement à ce problème qui me manque?

5122014009
la source

Réponses:

284

Tous les identifiants (y compris les noms de colonnes) qui ne sont pas entre guillemets sont repliés en minuscules dans PostgreSQL. Les noms de colonnes qui ont été créés avec des guillemets doubles et donc conservés des lettres majuscules (et / ou d'autres violations de syntaxe) doivent être entre guillemets pour le reste de leur vie: ( "first_Name")

Donc, oui , les noms de colonnes PostgreSQL sont sensibles à la casse:

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

Corrigez également les guillemets incorrects autour 'xyz'. Les valeurs (chaînes littérales) sont placées entre guillemets simples .

Lisez le manuel ici.

Mon conseil permanent est d'utiliser exclusivement des noms légaux en minuscules afin d'éviter les doubles guillemets.

Erwin Brandstetter
la source
4
@ArtB: Le standard SQL définit des identifiants insensibles à la casse, tout comme Postgres l'implémente. Le seul écart: les identifiants sans guillemets sont pliés en majuscules dans la norme, mais pg en minuscules tout ce qui n'est pas entre guillemets. (Uniquement pertinent dans de rares cas d'angle.) Détails dans le manuel ici.
Erwin Brandstetter
1
@adfs: Je ne pense pas pouvoir l'expliquer mieux que je ne l'ai déjà fait. Pour en savoir plus, suivez le lien vers le manuel que j'ai fourni à plusieurs reprises.
Erwin Brandstetter
15
@adfs: Dans SQL, foobar, FOOBARet FooBarsont le même identifiant. Cependant "foobar", "FooBar"et "FOOBAR"sont des identifiants différents
a_horse_with_no_name
5
@a_horse_with_no_name oui, mais sous SQL foobaret FOOBARsont les mêmes que "FOOBAR", sous potgresql FOOBARet foobaretc sont les mêmes que "foobar".
Jasen
1
@KamelMili: Je suggère de poser votre question sous forme de question , en fournissant toutes les informations nécessaires. Les commentaires ne sont pas l'endroit. Vous pouvez toujours créer un lien vers cette réponse pour le contexte. Et vous pouvez laisser un commentaire avec le lien vers votre question connexe ici (pour attirer également mon attention).
Erwin Brandstetter
16

Pour citer la documentation :

Les mots clés et les identifiants non cités sont insensibles à la casse. Par conséquent:

UPDATE MY_TABLE SET A = 5;

peut être écrit de manière équivalente:

uPDaTE my_TabLE SeT a = 5;

Vous pouvez également l'écrire en utilisant des identifiants entre guillemets :

UPDATE "my_table" SET "a" = 5;

Le fait de citer un identifiant le rend sensible à la casse, tandis que les noms sans guillemets sont toujours pliés en minuscules (contrairement à la norme SQL où les noms sans guillemets sont pliés en majuscules). Par exemple, les identifiants FOO, fooet "foo"sont considérés comme identiques par PostgreSQL, mais "Foo"et "FOO"sont différents de ces trois et l'autre.

Si vous souhaitez écrire des applications portables, il est conseillé de toujours citer un nom particulier ou de ne jamais le citer.

Eugène Yarmash
la source
8

Les noms de colonnes mixtes en majuscules ou en majuscules doivent être entre guillemets dans PostgresQL. La meilleure convention sera donc de suivre tous les petits cas avec un trait de soulignement.

hasard
la source
2
Ceci est incorrect selon l'explication donnée par @ erwin-brandstetter
Michael Silver
9
En quoi est-ce incorrect? Si vous avez des noms de colonne mixtes en majuscules ou en majuscules, pour y faire référence, vous devez mettre l'identifiant entre guillemets.
theferrit32