60

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

4

12 回答 12

46

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

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

这会给你一个看起来像在foo任何地方都被调用的列,但是你必须双引号它并在你使用它时包含空格:

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

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

于 2012-04-18T00:38:32.120 回答
41

如果由于某种原因您创建了混合大小写或大写的列名,则需要引用它,否则会出现此错误:

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

请注意错误消息如何在引号中给出大小写。

于 2012-04-18T00:15:54.590 回答
35

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

SELECT * FROM table_name where "Foo" IS NULL
于 2012-04-18T00:20:31.130 回答
9

我通过在 Values 中使用撇号( ' )更改引号( " ) 来修复它。例如:

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

于 2015-11-17T03:08:19.397 回答
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)
于 2012-04-18T00:34:12.297 回答
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;

你瞧,列名周围有引号。那么最终postgres=# select "anID" FROM test;工作正常:

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

同样的道德,不要使用引号。

于 2015-04-10T21:53:35.593 回答
4

出现问题是因为列的名称在内部是驼峰式的,它用“”(双引号)将它包装起来以解决这个问题,在表中插入值时使用单引号('')

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

于 2018-06-29T08:55:57.037 回答
3

就我而言,当我运行选择查询时,它可以工作并提供所需的数据。但是当我运行查询时

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'
于 2021-01-11T10:30:20.493 回答
2

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

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

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

于 2015-11-25T23:06:49.960 回答
2

我通过引用列名解决了类似的问题

SELECT * from table_name where "foo" is NULL;

就我而言,这只是

SELECT id, "foo" from table_name;

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

于 2018-03-02T07:07:02.933 回答
0

我正在处理地址数据并使用 pandas 将数据加载到 Postgres。pandas_usaddress 库在解析我的地址方面做得很好,但将新列放入了 InSpeCific 案例。疯狂的。但是现在我必须对每个列名使用双引号。从 har_addresses 中选择“邮编”;我得到了我的数据。

于 2021-10-11T10:58:41.503 回答
0

当我使用 Dapper 并忘记输入参数化值时,我也遇到了这个错误。

为了解决这个问题,我必须确保作为参数传入的对象具有与 SQL 字符串中的参数化值匹配的属性。

于 2020-09-24T05:52:58.973 回答