wake-up-neo.net

PostgreSQL-Spalte 'foo' ist nicht vorhanden

Ich habe eine Tabelle, die 20 ganzzahlige Spalten und eine Textspalte mit dem Namen 'foo' hat.

Wenn ich die Abfrage starte:

SELECT * from table_name where foo is NULL

Ich bekomme einen Fehler:

ERROR:  column "foo" does not exist

Ich habe mich selbst davon überzeugt, dass seine Kolumne tatsächlich existiert. Wenn ich so etwas mache:

SELECT * from table_name where count is NULL

Die resultierende Ausgabe zeigt 'foo' als eine der Spalten .... Ich schätze, ich muss etwas spezielles in der Abfrage tun, da foo eine Textspalte ist ...

Vielen Dank für die Hilfe (POSTGRESQL 8.3)

35
nulltorpedo

Sie haben versehentlich den Spaltennamen mit einem abschließenden Leerzeichen erstellt, und vermutlich hat phpPGadmin den Spaltennamen mit Anführungszeichen erstellt:

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

Das würde Ihnen eine Kolumne geben, die aussah, als würde sie überall foo heißen, aber Sie müssten sie doppelt zitieren und das Leerzeichen einschließen, wenn Sie es verwenden:

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

Die bewährte Methode ist die Verwendung von Spaltennamen ohne Spalten in PostgreSQL. Es sollte irgendwo in phpPGadmin eine Einstellung geben, die dazu führt, dass keine Bezeichner (wie Tabellen- und Spaltennamen) angegeben werden. Ich benutze phpPGadmin jedoch nicht, so dass ich nicht weiß, wo sich diese Einstellung befindet (oder sogar, wenn sie existiert).

35
mu is too short

Wenn Sie aus irgendeinem Grund einen Spaltennamen mit Groß- oder Großbuchstaben erstellt haben, müssen Sie ihn zitieren oder diese Fehlermeldung erhalten

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.

28
9000

PostreSQL konvertiert anscheinend Spaltennamen in eine SQL-Abfrage in Kleinbuchstaben. Sie können das Problem beheben, indem Sie den Spaltennamen in Anführungszeichen setzen:

SELECT * FROM table_name where "Foo" IS NULL
25
Russell Fox

Wie andere in Kommentaren vorgeschlagen haben, handelt es sich wahrscheinlich um eine Groß- oder Kleinschreibung oder um ein Leerzeichen im Spaltennamen. (Ich verwende eine Antwort, damit ich einige Codebeispiele formatieren kann.) Führen Sie die folgende Abfrage aus, um die Spaltennamen wirklich anzuzeigen:

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

Sie sollten wahrscheinlich auch das PostgreSQL-Serverprotokoll überprüfen, wenn Sie können, um zu sehen, was für die Anweisung gemeldet wird.

Wenn Sie einen Bezeichner angeben, ist alles in Anführungszeichen Teil des Bezeichners, einschließlich Großbuchstaben, Zeilenenden, Leerzeichen und Sonderzeichen. Die einzige Ausnahme ist, dass zwei benachbarte Anführungszeichen als Escape-Sequenz für ein Anführungszeichen verwendet werden. Wenn ein Bezeichner nicht in Anführungszeichen steht, werden alle Buchstaben in Kleinbuchstaben zusammengefasst. Hier ist ein Beispiel für 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 Frage, die ich oben gezeigt habe, liefert folgendes:

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

Es könnten Zitate sein, die das gesamte Problem darstellen. 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 Whitespace-Probleme gab, sondern lediglich Anführungszeichen, die Probleme verursachen. 

Die Spalte sah aus, als hieß sie anID, hieß aber wirklich "anID". Die Zitate erscheinen nicht in typischen Abfragen, daher war es schwer zu erkennen (für diesen Nachwuchs-Neuling). Dies ist auf postgres 9.4.1

Etwas mehr Detail:

postgres=# SELECT * FROM test; gaben:

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

der Versuch, nur die erste Spalte SELECT anID FROM test; auszuwählen, führte zu einem Fehler:

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

Ein Blick auf die Spaltennamen half nicht: 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 den Spaltennamen klicken und in dem SQL-Bereich nachsehen, in dem es gefüllt ist:

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

und siehe da, die Spalten stehen um die Spalten. Also letztendlich funktioniert postgres=# select "anID" FROM test; gut:

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

Gleiche Moral, keine Anführungszeichen verwenden.

4
BradP

Ich habe das Problem durch Ändern des Anführungszeichens ( ") mit Apostroph ( ' Behoben =) innerhalb von Werten, 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, die Spalte datetime ist VarChar .

Wir sind auf dieses Problem gestoßen, als wir die Tabelle mit dem phppgadmin-Client erstellt haben. Mit phppgadmin haben wir keine doppelten Anführungszeichen in Spaltennamen angegeben und trotzdem sind wir auf dasselbe Problem gestoßen.

Wenn wir mit caMel case eine Spalte erstellen, fügt phpPGAdmin implizit doppelte Anführungszeichen um den Spaltennamen hinzu. Wenn Sie eine Spalte mit allen Kleinbuchstaben erstellen, werden Sie nicht auf dieses Problem stoßen.

Sie können die Spalte in phppgadmin ändern und den Spaltennamen in Kleinbuchstaben ändern, wodurch dieses Problem behoben wird.

das Problem tritt auf, weil der Name der Spalte in Kamel-Fall ist Intern umschließt es ihn in "" (doppelte Anführungszeichen) Um dies zu lösen, verwenden Sie beim Einfügen von Werten in die Tabelle einfache Anführungszeichen ('').

z.B. Einfügen in Werte von schema_name.tabellenname ('', '', '');

1
meenal

Ich habe ähnliche Probleme behoben, indem ich den Spaltennamen qutierte

SELECT * from table_name where "foo" is NULL;

In meinem Fall war es einfach so

SELECT id, "foo" from table_name;

ohne Anführungszeichen habe ich den gleichen Fehler.

0
Titulus