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)

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

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

这将为您提供一个看起来像到处都被称为foo的列,但是您必须在使用它时将其双引号并包含空格:

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

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

如果由于某种原因您创建了混合大小写或大写列名称,则需要将其括起来,否则会收到此错误:

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

请注意错误消息如何用引号引起来表示大小写。

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

SELECT * FROM table_name where "Foo" IS NULL

我通过在值中更改带有撇号') 的引号") 来修复它。例如:

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。

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

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'

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

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)

引号本身可能是整个问题。 我遇到了类似的问题,这是由于 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)

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

由于列的名称在驼峰大小写中而出现问题在内部,它将其包装在" "(双引号)要解决此问题,在表中插入值时,请使用单引号 ('')

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

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

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

您可以在phppgadmin中更改列并将列名称更改为所有小写,此问题将消失。

我通过查询列名解决了类似的问题

SELECT * from table_name where "foo" is NULL;

就我而言,这只是

SELECT id, "foo" from table_name;

没有引号,我遇到了同样的错误。

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

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

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

最新更新