>我有一个表,其中包含 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中选择"邮政编码";我得到了我的数据。