2012-04-17 20 views
27

Tengo una tabla que tiene 20 columnas de tipo entero y columna de texto 1 denominado 'foo'columna PostgreSQL 'foo' no existe

Si me quedo consulta:

SELECT * from table_name where foo is NULL 

me sale error:

ERROR: column "foo" does not exist 

Me he comprobado a mí mismo que su columna de hecho existe. Si hago algo como:

SELECT * from table_name where count is NULL 

El resultado de salida muestra 'foo' como una de las columnas .... que supongo que tengo que hacer algo especial en la consulta porque foo es una columna de texto .. .

Gracias por la ayuda (PostgreSQL 8.3)

+1

¿Qué ves si entras en psql y escribes "\ d table_name"? –

+2

¿Cómo se creó la columna? ¿Fue creado como '" Foo "' o '" Foo "' o similar? –

+0

@PaulTomblin Estoy accediendo usando phpPGmyadmin, no tengo acceso a la línea de cmd. – nulltorpedo

Respuesta

27

forma accidental, creó el nombre de la columna con un espacio al final y, presumiblemente, phpPgAdmin creó el nombre de la columna con el doble con comillas:

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

que le daría una columna que parecía que se llamaba foo todas partes, pero usted tendría que duplicar la cita i ty incluye el espacio cada vez que lo utilice:

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

La mejor práctica es utilizar nombres de columna no cotizados 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).

26

Si por alguna razón se ha creado un con mayúsculas y minúsculas o en mayúsculas nombre de la columna, es necesario citarlo, o conseguir 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.

18

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. Se puede solucionar poniendo el nombre de la columna entre comillas:

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

Esta es la respuesta que me solucionó. Es una extraña rareza de Postgres para encubrir los nombres de las columnas en minúsculas, pero requiere la coincidencia exacta con el caso. ¡Gracias! –

4

Como otros sugirieron en los comentarios, esto es probablemente una cuestión de mayúscula en comparación con minúscula, o algún espacio en blanco en el nombre de la columna. (. Estoy usando una respuesta para que pueda formatear algunos ejemplos de código) Para ver lo que los nombres de columna son en realidad, intente ejecutar esta consulta:

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

Debería probablemente comprobar su registro del servidor PostgreSQL si se puede, para ver lo que 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 es no entre comillas, todas las letras se pliegan en minúsculas. Aquí está un ejemplo de un 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 mostré a los mejores rendimientos esto:

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

Podría ser las propias cotizaciones 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 realmente 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). Este es el postgres 9.4.1

algo más de detalle:

Haciendo postgres=# SELECT * FROM test; dio:

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

pero se trata de seleccionar sólo la primera columna SELECT anID FROM test; dio lugar a 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 SQL se rellena con:

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

y he aquí están los quoutes todo el nombre de la columna. De manera que, en última instancia postgres=# select "anID" FROM test; funciona bien:

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

mismo moral, no hace uso de comillas.

1

i fijo cambiando la marca cita (") con apóstrofe (') en el interior 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 datetime columna es VarChar.

1

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.

Creamos columna con el caso caMel luego 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 modificar la columna en phppgadmin y cambiar el nombre de la columna a todas las minúsculas, este problema desaparecerá.

+1

Según su respuesta, cree que el problema podría ser que el nombre de la columna no sea "foo". Luego debe decirlo claramente y se le puede pedir el resultado de la declaración seleccionada desde donde se podía ver, cómo se creó. Solo para estar seguro de que este es el caso. Es una buena práctica proporcionar una solución para este caso según lo propuesto por su respuesta. Por lo tanto, edite su respuesta para proporcionar una solución más útil. – iOS

0

i fijo problemas similares por qutating nombre de la columna

SELECT * from table_name where "foo" is NULL; 

En mi caso era sólo

SELECT id, "foo" from table_name; 

sin comillas i'v tiene el mismo error.

Cuestiones relacionadas