web-dev-qa-db-fra.com

La colonne 'toto' de PostgreSQL n'existe pas

J'ai une table qui a 20 colonnes entières et 1 colonne de texte nommée 'foo'

Si je lance la requête:

SELECT * from table_name where foo is NULL

Je reçois une erreur:

ERROR:  column "foo" does not exist

Je me suis vérifié que sa colonne existe bien. Si je fais quelque chose comme:

SELECT * from table_name where count is NULL

La sortie résultante montre "foo" comme l'une des colonnes .... Je suppose que je dois faire quelque chose de spécial dans la requête car foo est une colonne de texte ...

Merci pour l'aide (POSTGRESQL 8.3)

35
nulltorpedo

Vous avez accidentellement créé le nom de la colonne avec un espace de fin et probablement phpPGadmin a créé le nom de la colonne avec des guillemets:

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

Cela vous donnerait une colonne qui ressemblerait à foo partout mais vous auriez à la citer deux fois et à inclure l'espace chaque fois que vous l'utiliserez:

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

La meilleure pratique consiste à utiliser des noms de colonne en minuscule sans guillemets avec PostgreSQL. Il devrait y avoir un paramètre dans phpPGadmin quelque part qui lui dira de ne pas citer les identifiants (tels que les noms de tables et de colonnes), mais hélas, je n'utilise pas phpPGadmin, donc je ne sais pas où se trouve ce paramètre (ni même s'il existe).

35
mu is too short

Si, pour une raison quelconque, vous avez créé un nom de colonne en majuscules ou en majuscules, vous devez le citer ou obtenir l'erreur suivante:

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=> _

Notez comment le message d'erreur donne le cas entre guillemets.

28
9000

Apparemment, PostreSQL convertit les noms de colonne en minuscules dans une requête SQL - J'ai rencontré des problèmes où des noms de colonne à casse mixte génèrent cette erreur. Vous pouvez résoudre ce problème en mettant le nom de la colonne entre guillemets:

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

Comme d'autres l'ont suggéré dans les commentaires, il s'agit probablement de majuscules ou de minuscules, ou de certains espaces dans le nom de la colonne. (J'utilise une réponse pour pouvoir formater des exemples de code.) Pour voir quels sont réellement les noms de colonnes, essayez d'exécuter cette requête:

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

Vous devriez probablement également consulter le journal de votre serveur PostgreSQL si vous le pouvez pour voir ce qu’il rapporte pour l’instruction.

Si vous citez un identifiant, tout entre guillemets fait partie de l'identifiant, y compris les majuscules, les fins de ligne, les espaces et les caractères spéciaux. La seule exception est que deux caractères de citation adjacents sont utilisés comme séquence d'échappement pour un caractère de citation. Lorsqu'un identifiant est pas entre guillemets, toutes les lettres sont pliées en minuscules. Voici un exemple de comportement normal:

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;
                              ^

La requête que j'ai affichée au sommet donne ceci:

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

Ce pourrait être des citations elles-mêmes qui constituent l’ensemble du problème. J'ai eu un problème similaire et il était dû à des guillemets autour du nom de la colonne dans l'instruction CREATE TABLE. Notez qu'il n'y a pas eu de problèmes d'espaces, juste des citations posant des problèmes. 

La colonne semblait s'appeler anID mais s'appelait réellement "anID". Les citations n'apparaissant pas dans les requêtes classiques, il était donc difficile à détecter (pour cette recrue postgres). Ceci est sur postgres 9.4.1

Quelques détails supplémentaires:

Faire postgres=# SELECT * FROM test; a donné:

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

mais essayer de ne sélectionner que la première colonne SELECT anID FROM test; a généré une erreur:

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

Le simple fait de regarder les noms de colonnes n’a pas aidé: postgres=# \d test;

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

mais dans pgAdmin, si vous cliquez sur le nom de la colonne et regardez dans le volet SQL, il contient:

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

et voilà qu'il y a les quoutes autour du nom de la colonne. Donc, finalement, postgres=# select "anID" FROM test; fonctionne bien:

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

Même morale, n'utilisez pas de citations.

4
BradP

Nous avons rencontré ce problème lorsque nous avons créé la table à l'aide du client phppgadmin. Avec phppgadmin, nous n’avons pas spécifié de guillemets doubles dans le nom de la colonne et nous avons toujours le même problème.

Si nous créons une colonne avec un cas caMel, phpPGAdmin ajoute implicitement des guillemets doubles autour du nom de la colonne. Si vous créez une colonne avec toutes les minuscules, vous ne rencontrerez pas ce problème.

Vous pouvez modifier la colonne dans phppgadmin et changer le nom de la colonne en minuscules, ce problème disparaîtra.

le problème se produit parce que le nom de la colonne est en cas de chameau en interne, il est entouré de "" (guillemets doubles) pour résoudre ce problème, au moment de l'insertion de valeurs dans la table, utilisez des guillemets simples ('')

par exemple. insérer dans schema_name.table_name valeurs ('', '', '');

1
meenal

J'ai corrigé des problèmes similaires en citant le nom de la colonne

SELECT * from table_name where "foo" is NULL;

Dans mon cas c'était juste

SELECT id, "foo" from table_name;

sans guillemets, j'ai la même erreur.

0
Titulus