Столбец 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;
без кавычек у меня такая же ошибка.