我有一个包含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)
答案 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字符串中的参数化值匹配的属性。