I nomi delle colonne PostgreSQL fanno distinzione tra maiuscole e minuscole?


157

Ho un esempio tabella db, personsin Postgres tramandata da un'altra squadra che ha voce in capitolo nome di colonna, "first_Name". Ora sto cercando di usare PG Commander per interrogare questa tabella su questo nome-colonna.

select * from persons where first_Name="xyz";

E ritorna

ERRORE: la colonna "first_Name" non esiste

Non sono sicuro se sto facendo qualcosa di stupido o c'è una soluzione a questo problema che mi manca?

Risposte:


284

Tutti gli identificatori (compresi i nomi di colonna) che non sono racchiusi tra virgolette vengono piegati in minuscolo in PostgreSQL. I nomi delle colonne che sono stati creati con virgolette doppie e quindi le lettere maiuscole (e / o altre violazioni della sintassi) devono essere racchiusi tra virgolette per il resto della loro vita: ( "first_Name")

Quindi, , i nomi delle colonne PostgreSQL fanno distinzione tra maiuscole e minuscole:

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

Correggi anche le virgolette doppie errate in giro 'xyz'. I valori ( valori letterali stringa) sono racchiusi tra virgolette singole .

Leggi il manuale qui.

Il mio consiglio permanente è di usare esclusivamente nomi legali in minuscolo, quindi non è necessaria la doppia virgoletta.


4
@ArtB: lo standard SQL definisce identificatori senza distinzione tra maiuscole e minuscole, proprio come Postgres lo implementa. L'unica deviazione: gli identificatori non quotati sono piegati in maiuscolo nello standard, ma in minuscolo tutto ciò che non è tra virgolette doppie. (Rilevante solo in rari casi d'angolo.) Dettagli nel manuale qui.
Erwin Brandstetter,

1
@adfs: non credo di poterlo spiegare meglio di quanto non abbia già fatto. Per di più, segui il link al manuale che ho fornito più volte.
Erwin Brandstetter,

15
@adfs: In SQL, foobar, FOOBARe FooBarsono lo stesso identificatore. Tuttavia "foobar", "FooBar"e "FOOBAR"sono identificatori diversi
a_horse_with_no_name

5
@a_horse_with_no_name yes, ma in SQL foobare FOOBARsono gli stessi di "FOOBAR", in potgresql FOOBARed foobarecc. sono gli stessi di "foobar".
Jasen

1
@KamelMili: suggerisco di porre la tua domanda come domanda , fornendo tutte le informazioni necessarie. I commenti non sono il posto giusto. Puoi sempre collegarti a questa risposta per il contesto. E puoi lasciare un commento con il link alla tua domanda correlata qui (per attirare anche la mia attenzione).
Erwin Brandstetter,

16

Per citare la documentazione :

Le parole chiave e gli identificatori non quotati non fanno distinzione tra maiuscole e minuscole. Perciò:

UPDATE MY_TABLE SET A = 5;

può essere equivalentemente scritto come:

uPDaTE my_TabLE SeT a = 5;

Puoi anche scriverlo usando gli identificatori tra virgolette :

UPDATE "my_table" SET "a" = 5;

La citazione di un identificatore fa distinzione tra maiuscole e minuscole, mentre i nomi non quotati vengono sempre piegati in minuscolo (a differenza dello standard SQL in cui i nomi non quotati vengono piegati in maiuscolo). Ad esempio, gli identificatori FOO, fooe "foo"sono considerati dello stesso da PostgreSQL, ma "Foo"e "FOO"sono diversi da questi tre e l'altro.

Se si desidera scrivere applicazioni portatili, si consiglia di citare sempre un nome particolare o di non citarlo mai.


8

I nomi delle colonne che sono maiuscoli o minuscoli devono essere racchiusi tra virgolette doppie in PostgresQL. Quindi la migliore convenzione sarà quella di seguire tutti i piccoli casi con trattino basso.


2
Questo non è corretto secondo la spiegazione fornita da @ erwin-brandstetter
Michael Silver il

9
Come è errato? Se hai nomi di colonna che sono maiuscoli o minuscoli, per farvi riferimento devi mettere l'identificatore tra virgolette doppie.
theferrit32
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.