Bei PostgreSQL-Spaltennamen wird zwischen Groß- und Kleinschreibung unterschieden?

157

Ich habe eine DB-Tabelle personsin Postgres, die von einem anderen Team mit einem Spaltennamen überliefert wurde "first_Name". Jetzt versuche ich, PG Commander zu verwenden, um diese Tabelle nach diesem Spaltennamen abzufragen.

select * from persons where first_Name="xyz";

Und es kehrt einfach zurück

FEHLER: Spalte "Vorname" existiert nicht

Sie sind sich nicht sicher, ob ich etwas Dummes mache oder ob es eine Problemumgehung für dieses Problem gibt, die mir fehlt?

5122014009
quelle

Antworten:

284

Alle Bezeichner (einschließlich Spaltennamen), die nicht in doppelte Anführungszeichen gesetzt sind, werden in PostgreSQL in Kleinbuchstaben gefaltet. Spaltennamen, die mit doppelten Anführungszeichen erstellt wurden und dabei Großbuchstaben (und / oder andere Verstöße gegen die Syntax) beibehalten wurden, müssen für den Rest ihres Lebens in doppelte Anführungszeichen gesetzt werden: ( "first_Name")

Also, ja , sind PostgreSQL Spaltennamen case-sensitive:

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

Korrigieren Sie auch die falschen doppelten Anführungszeichen 'xyz'. Werte (Zeichenfolgenliterale) werden in einfache Anführungszeichen gesetzt .

Lesen Sie hier das Handbuch.

Mein ständiger Rat ist, ausschließlich legale Kleinbuchstaben zu verwenden, damit keine doppelten Anführungszeichen erforderlich sind.

Erwin Brandstetter
quelle
4
@ArtB: Der SQL-Standard definiert Bezeichner, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, genau wie Postgres sie implementiert. Die einzige Abweichung: Nicht zitierte Bezeichner werden im Standard in Großbuchstaben gefaltet, aber pg Kleinbuchstaben alles, was nicht doppelt in Anführungszeichen steht. (Nur in seltenen Eckfällen relevant.) Details im Handbuch hier.
Erwin Brandstetter
1
@adfs: Ich glaube nicht, dass ich es besser erklären kann als ich es bereits getan habe. Weitere Informationen finden Sie unter dem Link zu dem Handbuch, das ich wiederholt bereitgestellt habe.
Erwin Brandstetter
15
@adfs: In SQL foobar, FOOBARund FooBarist die gleiche Kennung. Allerdings "foobar", "FooBar"und "FOOBAR"sind unterschiedliche Bezeichner
a_horse_with_no_name
5
@a_horse_with_no_name ja, aber unter SQL foobarund FOOBARsind die gleichen wie "FOOBAR", unter potgresql FOOBARund foobaretc sind die gleichen wie "foobar".
Jasen
1
@KamelMili: Ich schlage vor, Ihre Frage als Frage zu stellen und alle notwendigen Informationen bereitzustellen . Kommentare sind nicht der richtige Ort. Sie können jederzeit eine Verknüpfung zu dieser Antwort für den Kontext herstellen. Und Sie können hier einen Kommentar mit dem Link zu Ihrer verwandten Frage hinterlassen (um auch meine Aufmerksamkeit zu erregen).
Erwin Brandstetter
16

So zitieren Sie die Dokumentation :

Schlüsselwörter und nicht zitierte Bezeichner unterscheiden nicht zwischen Groß- und Kleinschreibung. Deshalb:

UPDATE MY_TABLE SET A = 5;

kann äquivalent geschrieben werden als:

uPDaTE my_TabLE SeT a = 5;

Sie können es auch mit Anführungszeichen schreiben :

UPDATE "my_table" SET "a" = 5;

Wenn Sie einen Bezeichner angeben, wird zwischen Groß- und Kleinschreibung unterschieden, während nicht zitierte Namen immer in Kleinbuchstaben gefaltet werden (im Gegensatz zum SQL-Standard, bei dem nicht zitierte Namen in Großbuchstaben gefaltet werden). Zum Beispiel können die Kennungen FOO, foound "foo"sind die gleichen von PostgreSQL betrachtet, sondern "Foo"und "FOO"unterscheiden sich von diesen drei und miteinander.

Wenn Sie tragbare Anwendungen schreiben möchten, wird empfohlen, immer einen bestimmten Namen oder niemals einen bestimmten Namen anzugeben.

Eugene Yarmash
quelle
8

Die Spaltennamen in Groß- oder Kleinschreibung müssen in PostgresQL in doppelte Anführungszeichen gesetzt werden. Die beste Konvention ist es also, alle kleinen Fälle mit Unterstrich zu verfolgen.

Zufälligkeit
quelle
2
Dies ist falsch gemäß der Erklärung von @ erwin-brandstetter
Michael Silver
9
Wie ist das falsch? Wenn Sie Spaltennamen in Groß- oder Kleinschreibung haben, müssen Sie den Bezeichner in doppelte Anführungszeichen setzen, um auf diese zu verweisen.
Theferrit32