2014-10-29 31 views
6

Ich habe dieses seltsame Problem mit PostgreSQL 9.3 mit Tabellen, die mit Qoutes erstellt werden. Zum Beispiel, wenn ich eine Tabelle mit qoutes erstellen:PostgreSQL FEHLER: 42P01: Relation "[Tabelle]" existiert nicht

create table "TEST" ("Col1" bigint); 

die Tabelle richtig erstellt wird, und ich kann sehen, dass die Zitate beibehalten werden, wenn Ansicht es im SQL-Bereich von pgAdminIII. Aber wenn ich die Datenbank abfrage, um die Liste aller verfügbaren Tabellen zu finden (unter Verwendung der folgenden Abfrage), sehe ich, dass das Ergebnis keine Anführungszeichen um den Tabellennamen enthält.

select table_schema, table_name from information_schema.tables where not table_schema='pg_catalog' and not table_schema='information_schema'; 

Da die Tabelle mit Zitaten erstellt wurde, kann ich nicht die Tabellennamen direkt aus der obigen Abfrage zurückgegeben verwenden, da es nicht notiert und führt den Fehler in der Überschrift geschrieben.

Ich könnte versuchen, die Tabellennamen mit Anführungszeichen in allen Abfragen zu umgeben, aber ich bin mir nicht sicher, ob es die ganze Zeit funktioniert. Ich suche nach einer Möglichkeit, die Liste der Tabellennamen zu erhalten, die im Ergebnis mit Anführungszeichen zitiert werden.

Ich habe das gleiche Problem mit Spaltennamen, aber ich hoffe, dass, wenn ich eine Lösung für die Tabellennamen Problem finden kann, eine ähnliche Lösung auch für Spaltennamen funktionieren wird.

Antwort

15

Sie haben zwei Möglichkeiten: - keine Anführungszeichen: dann wird alles automatisch Kleinbuchstaben und keine Groß- und Kleinschreibung - mit Anführungszeichen: ab jetzt ist alles Groß-und Kleinschreibung.

Ich würde sehr empfehlen, keine Anführungszeichen zu verwenden und PostgreSQL nicht Groß-und Kleinschreibung beachten. es macht das Leben so viel einfacher. Sobald Sie anfangen zu zitieren, müssen Sie es überall verwenden, da PostgreSQL sehr präzise wird.

einig Beispiel:

TEST = test  <-- non case sensitive 
    "Test" <> Test <-- first is precise, second one is turned to lower case 
    "Test" = "Test" <-- will work 
    "test" = TEST  <-- should work; but you are just lucky. 

wirklich versuchen, diese Art von Tricks, um jeden Preis zu vermeiden. Bleiben Sie mit 7 Bit ASCII für Objektnamen.

+0

+1 keine Anführungszeichen verwenden. – Othya

+0

Stimmen Sie zu, dass die Verwendung von Anführungszeichen in PostgreSQL das Leben einfacher macht, aber in meinem Fall nicht immer möglich ist, da meine Anwendung die Datenbanken nicht erstellt. Es sollte in der Lage sein, Daten von PostgreSQL-Datenbanken von Drittanbietern zu lesen, und ich kann nicht steuern, wie Tabellen von anderen erstellt werden. In jedem Fall ist es überraschend, dass PostgreSQL mir nicht mitteilt, dass eine bestimmte Tabelle mit Anführungszeichen erstellt wurde, aber wenn ich einen nicht angegebenen Tabellennamen in einer Abfrage verwende, wird dies nicht zugelassen. –

+1

es weiß automatisch, dass Zitate verwendet wurden, sobald dort ein Nicht-Kleinbuchstabe ist. Wenn also eine Tabelle als Test aufgelistet ist, bedeutet das, dass Sie die Groß-/Kleinschreibung beachten müssen. –

0

Eine Zeichenfolgenfunktion, die verwendet wird, um Bezeichner in einer SQL-Anwei- sungszeichenfolge angemessen anzugeben, ist quote_ident(), die auf eine good example verweist (in Verbindung mit der zugehörigen quote_literal()).

Ihr Beispiel zu verwenden, und in anderen Ergebnissen mischen:

select 
    quote_ident(table_schema) as table_schema, 
    quote_ident(table_name) as table_name 
... 

table_schema | table_name 
--------------+------------------ 
... 
public  | good_name 
public  | "table" 
public  | some_table 
public  | "something else" 
public  | "Tom's work" 
public  | "TEST" 
... 
Verwandte Themen