PostgreSQL列'foo'不存在

时间:2012-04-17 23:43:55

标签: sql database postgresql

我有一个包含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)

11 个答案:

答案 0 :(得分:36)

您不小心创建了带有尾随空格的列名,并且可能是phpPGadmin创建了带有双引号的列名称:

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

这会给你一个看起来像是foo到处都是select ... from your_table where "foo " is not null 的列,但你必须加倍引用它并在你使用它时包含空格:

{{1}}

最佳做法是在PostgreSQL中使用小写的不带引号的列名。 phpPGadmin中应该有一个设置会告诉它不引用标识符(例如表名和列名)但是唉,我不使用phpPGadmin所以我不在那个设置的地方(或者即使它存在)。

答案 1 :(得分:31)

如果由于某种原因你创建了一个混合大小写或大写的列名,你需要引用它,或者得到这个错误:

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

请注意错误消息如何用引号括起来。

答案 2 :(得分:27)

PostreSQL显然在sql查询中将列名转换为小写 - 我已经看到了混合大小写列名称会给出错误的问题。您可以通过将列名称放在引号中来修复它:

SELECT * FROM table_name where "Foo" IS NULL

答案 3 :(得分:5)

正如其他人在评论中所建议的那样,这可能是大写与小写或列名中的一些空白的问题。 (我正在使用答案,因此我可以格式化一些代码示例。)要查看列名实际是什么,请尝试运行此查询:

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

如果可以,您可能还应检查PostgreSQL服务器日志,以查看它为语句报告的内容。

如果引用标识符,则引号中的所有内容都是标识符的一部分,包括大写字符,行结尾,空格和特殊字符。唯一的例外是两个相邻的引号字符被视为一个引号字符的转义序列。当引号中的标识符时,所有字母都折叠为小写字母。以下是正常行为的示例:

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)

答案 4 :(得分:4)

可能引用自己就是整个问题。我有一个类似的问题,这是由于在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;

并且看到列名称周围有quoutes。所以最终postgres=# select "anID" FROM test;最终正常工作:

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

道德相同,不要使用引号。

答案 5 :(得分:4)

我通过在值内部用撇号')更改引号)来修复它。例如:

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

答案 6 :(得分:2)

发生问题是因为列名是驼峰式的 在内部将其包装在“”(双引号)中 为了解决这个问题,在表中插入值时,请使用单引号('')

例如 插入schema_name.table_name值('','','');

答案 7 :(得分:2)

在我的情况下,当我运行选择查询时,它可以工作并提供所需的数据。但是当我像

一样运行查询时
select * from users where email = "user@gmail.com"

它显示这个错误

ERROR:  column "user@gmail.com" does not exist
LINE 2: select * from users where email = "user@gmail.com...
                                          ^
SQL state: 42703
Character: 106

然后我对匹配条件使用单引号而不是双引号,它起作用了。例如

select * from users where email = 'user@gmail.com'

答案 8 :(得分:1)

我们在使用phppgadmin客户端创建表时遇到了这个问题。使用phppgadmin,我们没有在列名中指定任何双引号,但我们仍遇到同样的问题。

我们使用caMel创建列,然后phpPGAdmin隐式地在列名称周围添加双引号。如果您使用全小写创建列,那么您将不会遇到此问题。

您可以更改phppgadmin中的列,并将列名更改为全部小写,此问题将消失。

答案 9 :(得分:1)

我通过查询列名

修复了类似的问题
SELECT * from table_name where "foo" is NULL;

就我而言,它只是

SELECT id, "foo" from table_name;

没有引号我有同样的错误。

答案 10 :(得分:0)

使用Dapper时,我也遇到了此错误,却忘记了输入参数化值。

要修复,我必须确保作为参数传入的对象具有与SQL字符串中的参数化值匹配的属性。