the - La columna ''foo'' de PostgreSQL no existe
hint: perhaps you meant to reference the column (9)
Accidentalmente creó el nombre de la columna con un espacio al final y, presumiblemente, phpPGadmin creó el nombre de la columna con comillas dobles a su alrededor:
create table your_table (
"foo " -- ...
)
Eso le daría una columna que parecía que se llamaba foo
todas partes, pero tendría que doblarla e incluir el espacio siempre que lo use:
select ... from your_table where "foo " is not null
La mejor práctica es utilizar nombres de columnas sin comillas en minúsculas con PostgreSQL. Debería haber una configuración en phpPGadmin en alguna parte que le diga que no cite identificadores (como los nombres de tabla y columna) pero desafortunadamente, no uso phpPGadmin así que no entiendo dónde está esa configuración (o incluso si existe).
Tengo una tabla que tiene 20 columnas enteras y 1 columna de texto llamada ''foo''
Si ejecuto la consulta:
SELECT * from table_name where foo is NULL
Me sale un error:
ERROR: column "foo" does not exist
Me he comprobado a mí mismo que su columna existe realmente. Si hago algo como:
SELECT * from table_name where count is NULL
El resultado resultante muestra ''foo'' como una de las columnas ... Supongo que tengo que hacer algo especial en la consulta porque foo es una columna de texto ...
Gracias por la ayuda (POSTGRESQL 8.3)
Como otros sugirieron en los comentarios, esta es probablemente una cuestión de mayúsculas y minúsculas, o algunos espacios en blanco en el nombre de la columna. (Estoy usando una respuesta para poder formatear algunas muestras de código.) Para ver cuáles son realmente los nombres de las columnas, intente ejecutar esta consulta:
SELECT ''"'' || attname || ''"'', char_length(attname)
FROM pg_attribute
WHERE attrelid = ''table_name''::regclass AND attnum > 0
ORDER BY attnum;
Probablemente también debería verificar su registro de servidor PostgreSQL si puede, para ver qué informa para la declaración.
Si cita un identificador, todo entre comillas es parte del identificador, incluidos caracteres en mayúscula, finales de línea, espacios y caracteres especiales. La única excepción es que dos caracteres de comillas adyacentes se toman como una secuencia de escape para un carácter de comillas. Cuando un identificador no está entre comillas, todas las letras se pliegan en minúsculas. Aquí hay un ejemplo de comportamiento 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 consulta que mostré en la parte superior produce esto:
?column? | char_length
-----------+-------------
"alpha" | 5
"bravo" | 5
"Charlie" | 7
"delta " | 6
(4 rows)
Lo arreglé cambiando la comilla ( " ) con apóstrofo ( '' ) dentro de los valores. Por ejemplo:
insert into trucks ("id","datetime") VALUES (862,"10-09-2002 09:15:59");
Se convierte en esto:
insert into trucks ("id","datetime") VALUES (862,''10-09-2002 09:15:59'');
Suponiendo que la columna de datetime
es VarChar .
Nos encontramos con este problema cuando creamos la tabla utilizando el cliente phppgadmin. Con phppgadmin no especificamos ninguna comilla doble en el nombre de la columna y aún así nos encontramos con el mismo problema.
Si creamos una columna con un caso de caMel, phpPGAdmin agrega implícitamente comillas dobles alrededor del nombre de la columna. Si crea una columna con todas las minúsculas, entonces no se encontrará con este problema.
Puede alterar la columna en phppgadmin y cambiar el nombre de la columna en minúsculas, este problema desaparecerá.
Podrían ser citas en sí que son todo el problema. Tuve un problema similar y fue debido a las comillas alrededor del nombre de la columna en la declaración CREATE TABLE. Tenga en cuenta que no hubo problemas de espacio en blanco, solo las comillas causaron problemas.
La columna parecía que se llamaba anID
pero en realidad se llamaba "anID"
. Las comillas no aparecen en las consultas típicas, por lo que es difícil de detectar (para este novato de Postgres). Esto está en postgres 9.4.1
Algo más de detalle:
Hacer postgres=# SELECT * FROM test;
dio:
anID | value
------+-------
1 | hello
2 | baz
3 | foo (3 rows)
pero tratando de seleccionar solo la primera columna SELECT anID FROM test;
dio como resultado un error:
ERROR: column "anid" does not exist
LINE 1: SELECT anID FROM test;
^
Solo mirando los nombres de las columnas no ayudó: postgres=# /d test;
Table "public.test"
Column | Type | Modifiers
--------+-------------------+-----------
anID | integer | not null
value | character varying |
Indexes:
"PK on ID" PRIMARY KEY, btree ("anID")
pero en pgAdmin, si hace clic en el nombre de la columna y mira en el panel de SQL, se llena con:
ALTER TABLE test ADD COLUMN "anID" integer;
ALTER TABLE test ALTER COLUMN "anID" SET NOT NULL;
y he aquí que hay cotizaciones alrededor del nombre de la columna. Entonces, en última instancia, postgres=# select "anID" FROM test;
funciona bien:
anID
------
1
2
3
(3 rows)
La misma moral, no use comillas.
PostreSQL aparentemente convierte los nombres de las columnas en minúsculas en una consulta sql. He visto problemas en los que los nombres de las columnas de mayúsculas y minúsculas darán ese error. Puede solucionarlo colocando el nombre de la columna entre comillas:
SELECT * FROM table_name where "Foo" IS NULL
Si por alguna razón ha creado un nombre de columna de mayúsculas o minúsculas, debe citarlo u obtener este error:
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=> _
Observe cómo el mensaje de error muestra el caso entre comillas.
Solucioné problemas similares al agregar el nombre de la columna
SELECT * from table_name where "foo" is NULL;
En mi caso fue solo
SELECT id, "foo" from table_name;
sin citas, obtuve el mismo error.
el problema ocurre porque el nombre de la columna está en camel case internamente lo envuelve en "" (comillas dobles) para resolver esto, al momento de insertar valores en la tabla use comillas simples ('''')
por ejemplo, insertar en schema_name.table_name values ('''', '''', '''');