2012-04-17 15 views
27
existiert

Ich habe eine Tabelle, die 20 Integer-Spalten und 1 Textspalte hat 'foo' genanntPostgreSQL Spalte 'foo' nicht

Wenn ich Abfrage:

SELECT * from table_name where foo is NULL 

ich Fehler:

ERROR: column "foo" does not exist 

Ich habe mich selbst überprüft, dass seine Spalte tatsächlich existiert. Wenn ich so etwas wie:

SELECT * from table_name where count is NULL 

Die resultierende Ausgabe zeigt ‚foo‘ als eine der Spalten .... Ich vermute, ich etwas Besonderes in der Abfrage zu tun haben, weil foo eine Textspalte ist .. .

Danke für die Hilfe (POSTGRESQL 8.3)

+1

Was sehen Sie, wenn Sie in psql gehen und "\ d table_name" eingeben? –

+2

Wie haben Sie die Spalte erstellt? Wurde es als "Foo" oder "Foo" oder ähnlich erstellt? –

+0

@PaulTomblin Ich greife mit phpPGmyadmin, habe keinen Zugriff auf cmd Zeile. – nulltorpedo

Antwort

27

Sie versehentlich die Spaltennamen mit einem Leerzeichen am Ende erstellt und vermutlich phpPgAdmin erstellt die Spaltennamen mit Doppel um es Zitate:

create table your_table (
    "foo " -- ... 
) 

, dass Sie eine Spalte geben würde, der aussah, foo überall genannt wurde, aber Sie würden Zitat zu verdoppeln habe ich t und umfassen den Raum, wenn Sie es verwenden:

select ... from your_table where "foo " is not null 

Die beste Praxis Kleinschreibung nicht notierte Spaltennamen mit PostgreSQL zu verwenden ist.Es sollte irgendwo eine Einstellung in phpPGadmin geben, die besagt, dass keine Bezeichner (wie Tabellen- und Spaltennamen) zitiert werden sollen, aber leider verwende ich nicht phpPGadmin, also weiß ich nicht, wo diese Einstellung ist (oder auch wenn sie existiert).

26

Wenn Sie aus irgendeinem Grund einen Groß- und Klein oder Groß- Spaltennamen erstellt haben, müssen Sie es, oder erhalten diesen Fehler zitieren:

test=> create table moo("FOO" int); 
CREATE TABLE 
test=> select * from moo; 
FOO 
----- 
(0 rows) 
test=> select "foo" from moo; 
ERROR: column "foo" does not exist 
LINE 1: select "foo" from moo; 
      ^
test=> _ 

Beachten Sie, wie die Fehlermeldung den Fall in Anführungszeichen angibt.

18

PostreSQL konvertiert offensichtlich Spaltennamen in Kleinbuchstaben in einer SQL-Abfrage - ich habe Probleme gesehen, bei denen die Groß- und Kleinschreibung der Spaltennamen diesen Fehler ergibt. Sie können das Problem beheben, indem Sie die Spaltennamen in Anführungszeichen setzen:

SELECT * FROM table_name where "Foo" IS NULL 
+0

Dies ist die Antwort, die es für mich behoben hat. Eine komische Art von Postgres, um Spaltennamen in Kleinbuchstaben umzuwandeln, aber die genaue Übereinstimmung mit Groß- und Kleinschreibung erfordern. Vielen Dank! –

4

Wie andere in Kommentaren vorgeschlagen, dies ist wahrscheinlich eine Frage der Groß- im Vergleich zu Klein, oder ein Leerzeichen in dem Spaltennamen. (. Ich verwende eine Antwort, damit ich einige Code-Beispiele formatieren) Um zu sehen, was die Spaltennamen wirklich sind, versuchen Sie, diese Abfrage:

SELECT '"' || attname || '"', char_length(attname) 
    FROM pg_attribute 
    WHERE attrelid = 'table_name'::regclass AND attnum > 0 
    ORDER BY attnum; 

Sie sollten wahrscheinlich auch PostgreSQL Server Log überprüfen, wenn Sie können, um zu sehen, was es für die Aussage berichtet.

Wenn Sie einen Bezeichner zitieren, ist alles in Anführungszeichen Teil des Bezeichners, einschließlich Großbuchstaben, Zeilenenden, Leerzeichen und Sonderzeichen. Die einzige Ausnahme besteht darin, dass zwei benachbarte Anführungszeichen als Escape-Sequenz für ein Anführungszeichen verwendet werden. Wenn ein Bezeichner nicht in Anführungszeichen ist, werden alle Buchstaben in Kleinbuchstaben gefaltet. Hier ist ein Beispiel für eine normales Verhalten:

test=# create table t (alpha text, Bravo text, "Charlie" text, "delta " text); 
CREATE TABLE 
test=# select * from t where Alpha is null; 
alpha | bravo | Charlie | delta 
-------+-------+---------+-------- 
(0 rows) 

test=# select * from t where bravo is null; 
alpha | bravo | Charlie | delta 
-------+-------+---------+-------- 
(0 rows) 

test=# select * from t where Charlie is null; 
ERROR: column "charlie" does not exist 
LINE 1: select * from t where Charlie is null; 
          ^
test=# select * from t where delta is null; 
ERROR: column "delta" does not exist 
LINE 1: select * from t where delta is null; 
          ^

Die Abfrage, die ich bei den Spitzenrenditen zeigte dies:

?column? | char_length 
-----------+------------- 
"alpha" |   5 
"bravo" |   5 
"Charlie" |   7 
"delta " |   6 
(4 rows) 
3

Es könnte Zitate selbst sein, die das ganze Problem sind. Ich hatte ein ähnliches Problem und es war aufgrund von Anführungszeichen um den Spaltennamen in der CREATE TABLE-Anweisung. Beachten Sie, dass es keine Leerraumprobleme gab, nur Anführungszeichen, die Probleme verursachen.

Die Spalte sah so aus, als ob sie anID genannt wurde, wurde aber wirklich "anID" genannt. Die Anführungszeichen erscheinen nicht in typischen Abfragen, so dass es schwer zu erkennen war (für diesen Postgres Rookie). Dies ist auf Postgres 9.4.1

etwas detaillierter:

postgres=# SELECT * FROM test; tun gab:

anID | value 
------+------- 
    1 | hello 
    2 | baz 
    3 | foo (3 rows) 

aber nur die erste Spalte SELECT anID FROM test; in einem Fehler zu wählen versuchen:

ERROR: column "anid" does not exist 
LINE 1: SELECT anID FROM test; 
       ^

Nur die Spaltennamen zu sehen, hat nicht geholfen: postgres=# \d test;

  Table "public.test" 
Column |  Type  | Modifiers 
--------+-------------------+----------- 
anID | integer   | not null 
value | character varying | 
Indexes: 
    "PK on ID" PRIMARY KEY, btree ("anID") 

aber in pgAdmin, wenn Sie auf dem Spaltennamen klicken und mit im SQL-Bereich es bevölkerte aussehen:

ALTER TABLE test ADD COLUMN "anID" integer; 
ALTER TABLE test ALTER COLUMN "anID" SET NOT NULL; 

und siehe da gibt es den quoutes um die Spaltennamen. Also dann schließlich postgres=# select "anID" FROM test; funktioniert:

anID 
------ 
    1 
    2 
    3 
(3 rows) 

gleiche moralische, keine Anführungszeichen verwenden.

1

I fixiert es durch die sich ändernde Anführungszeichen (") mit Apostroph (") innerhalb Werte Zum Beispiel:.

insert into trucks ("id","datetime") VALUES (862,"10-09-2002 09:15:59");

wird dies:

insert into trucks ("id","datetime") VALUES (862,'10-09-2002 09:15:59');

Angenommen datetime Spalte ist VarChar.

1

Dieses Problem trat auf, als wir die Tabelle mit dem phppgadmin-Client erstellten. Mit phppgadmin haben wir keine doppelten Anführungszeichen im Spaltennamen angegeben und trotzdem sind wir auf dasselbe Problem gestoßen.

Es wird eine Spalte mit caMel case erstellt, dann fügt phpPGAdmin implizit doppelte Anführungszeichen um den Spaltennamen hinzu. Wenn Sie eine Spalte mit allen Kleinbuchstaben erstellen, wird dieses Problem nicht auftreten.

Sie können die Spalte in phppgadmin ändern und den Spaltennamen in Kleinbuchstaben ändern. Dieses Problem wird verschwinden.

+1

Entsprechend Ihrer Antwort denken Sie, dass das Problem möglicherweise darin besteht, dass der Spaltenname nicht "foo" ist. Sie sollten es dann klar sagen und nach dem Ergebnis der Select-Anweisung fragen, von wo aus Sie sehen könnten, wie es erstellt wurde. Nur um sicher zu sein, dass dies der Fall ist. Es ist eine gute Praxis, eine Lösung für diesen Fall bereitzustellen, wie von Ihrer Antwort vorgeschlagen. Bitte editieren Sie Ihre Antwort, um eine hilfreichere Lösung zu finden. – iOS

0

Ich reparierte ähnliche Probleme nach Spaltenname qutating

SELECT * from table_name where "foo" is NULL; 

In meinem Fall ist es

SELECT id, "foo" from table_name; 

ohne Anführungszeichen nur

war i'v gleichen Fehler bekam.

Verwandte Themen