2012-04-17 3 views
27

У меня есть таблица, которая имеет 20 целочисленных столбцов и 1 текстовый столбец с именем «Foo»столбец PostgreSQL «Foo» не существует

Если я запускаю запрос:

SELECT * from table_name where foo is NULL 

Я получаю сообщение об ошибке:

ERROR: column "foo" does not exist 

Я проверил себя, что его колонка действительно существует. Если я что-то вроде:

SELECT * from table_name where count is NULL 

Полученный вывод показывает «Foo» в качестве одной из колонн .... Я предполагаю, что я должен сделать что-то особенное в запросе, потому что Foo это текстовый столбец .. .

Спасибо за помощь (PostGreSQL 8,3)

+1

Что вы видите, если вы входите в psql и набираете «\ d table_name»? –

+2

Как вы создали столбец? Было ли оно создано как «Foo» или «Foo» или подобное? –

+0

@PaulTomblin Я получаю доступ с помощью phpPGmyadmin, не имею доступа к строке cmd. – nulltorpedo

ответ

27

Вы случайно создали имя столбца с завершающими пробелами и предположительно PhpPgAdmin создали имя столбца с двойным кавычки вокруг него:

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

это даст вам столбец, который выглядел, как его называли foo везде, но вы должны были бы двойные кавычки я т и включают в себя пространство, когда вы используете его:

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

Лучше всего использовать строчные некотируемые имена столбцов с PostgreSQL.В phpPGadmin должен быть параметр, который будет указывать ему, чтобы он не указывал идентификаторы (например, имена таблиц и столбцов), но, увы, я не использую phpPGadmin, поэтому я не знаю, где этот параметр (или даже если он существует).

26

Если по какой-то причине вы создали смешанного случая или прописной имя столбца, необходимо процитировать его или получить эту ошибку:

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

Обратите внимание, как сообщение об ошибке дает случай в кавычках.

18

PostreSQL, по-видимому, преобразует имена столбцов в нижний регистр в sql-запросе - я видел проблемы, в которых имена столбцов смешанного случая выдают эту ошибку. Вы можете это исправить, поставив имя столбца в кавычки:

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

Это ответ, который исправил его для меня. Вид странного Postgres quirk для скрытых имен столбцов в нижнем регистре, но требует точного соответствия с футляром. Благодаря! –

4

Как и другие предложили в комментариях, это, вероятно, вопрос прописными против строчными, или некоторые пробелы в имени столбца. (. Я использую ответ, так что я могу форматировать некоторые примеры кода) Для того, чтобы увидеть, что имена столбцов на самом деле, попробуйте запустить этот запрос:

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

Вы, вероятно, следует также проверить журнал сервера PostgreSQL, если вы можете, чтобы увидеть, что он сообщает для утверждения.

Если вы указываете идентификатор, все в кавычках является частью идентификатора, включая символы верхнего регистра, концы строк, пробелы и специальные символы. Единственное исключение состоит в том, что два соседних символа кавычки принимаются как escape-последовательность для одного символа кавычки. Когда идентификатор не в кавычках, все буквы складываются в нижний регистр. Вот пример нормального поведения:

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

Запрос я показал в верхней урожайности это:

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

Это могут быть кавычки, которые являются всей проблемой. У меня была аналогичная проблема, и это было связано с кавычками вокруг имени столбца в инструкции CREATE TABLE. Обратите внимание, что проблем с пробелами не возникало, а только кавычки, вызывающие проблемы.

Эта колонка выглядела так, как будто она называлась anID, но на самом деле была названа "anID". Кавычки не отображаются в типичных запросах, поэтому их было трудно обнаружить (для этого новобранца postgres). Это на Postgres 9.4.1

Некоторые более подробно:

Doing postgres=# SELECT * FROM test; дал:

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

но при попытке выбрать только первый столбец SELECT anID FROM test; привел к ошибке:

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

Просто глядя на названия колонок не помогло: postgres=# \d test;

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

но в pgAdmin если нажать на имя столбца и посмотреть в панели SQL он населен:

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

и вот существуют quoutes вокруг имени столбца. Итак, в конечном счете postgres=# select "anID" FROM test; работает отлично:

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

же нравственная, не используйте кавычки.

1

Я установил ее, изменив кавычки (") с апострофа (') внутри значений, например:.

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

становится этим:

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

Предполагая, что datetime столбец VarChar.

1

Мы столкнулись с этой проблемой, когда создали таблицу с помощью клиента phppgadmin. С phppgadmin мы не указывали двойные кавычки в имени столбца, и все же мы столкнулись с одной проблемой.

Это мы создаем столбец с флагом caMel, тогда phpPGAdmin неявно добавляет двойные кавычки вокруг имени столбца. Если вы создадите столбец со всеми строчными буквами, вы не столкнетесь с этой проблемой.

Вы можете изменить столбец в phppgadmin и изменить имя столбца на все строчные буквы, эта проблема исчезнет.

+1

Согласно вашему ответу, вы считаете, что проблема может заключаться в том, что имя столбца не является «foo». Вы должны четко сказать это и можете попросить результат выражения select, откуда вы могли видеть, как он был создан. Просто чтобы быть уверенным, что это так. Это хорошая практика, чтобы обеспечить решение этого случая, как было предложено вашим ответом. Поэтому, пожалуйста, отредактируйте свой ответ, чтобы предоставить более полезное решение. – iOS

0

Я установил аналогичные вопросы по qutating имя столбца

SELECT * from table_name where "foo" is NULL; 

В моем случае это было просто

SELECT id, "foo" from table_name; 

без кавычек i'v получил ту же ошибку.