Столбец PostgreSQL 'foo' не существует

У меня есть таблица с 20 целыми столбцами и 1 текстовым столбцом с именем '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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

SELECT * FROM table_name where "Foo" IS NULL

Ответ 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)

Ответ 5

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

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

Еще несколько деталей:

Выполнение 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;

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

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

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

Ответ 6

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

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.

Ответ 7

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

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

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

Ответ 8

проблема возникает из-за того, что имя столбца в корпусе верблюда внутренне оно обертывает его в "" (двойные кавычки), чтобы решить эту проблему, во время ввода значений в таблице используют одинарные кавычки ('')

например, вставлять в значения schema_name.table_name ('', '', '');

Ответ 9

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

SELECT * from table_name where "foo" is NULL;

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

SELECT id, "foo" from table_name;

без кавычек у меня такая же ошибка.