PostgreSQL“列不存在”但它确实存在

Posted

技术标签:

【中文标题】PostgreSQL“列不存在”但它确实存在【英文标题】:PostgreSQL "Column does not exist" but it actually does 【发布时间】:2021-12-04 06:16:01 【问题描述】:

我正在编写一个Java 应用程序来自动构建和运行 SQL 查询。对于许多表,我的代码可以正常工作,但在某个表上它会因抛出以下异常而卡住:

Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "continent" does not exist
  Hint: Perhaps you meant to reference the column "countries.Continent".
  Position: 8

已经运行的查询如下:

SELECT Continent
FROM network.countries
WHERE Continent IS NOT NULL
AND Continent <> ''
LIMIT 5

这实际上从列中返回5 非空值。

我不明白为什么在 pgAdmin 4 中明显出现“列不存在”错误。我可以看到有一个名为 Network 的架构,其中包含表 countries,并且该表有一个名为 Continent 的列,正如预期的那样。

由于所有列、模式和表名都是由应用程序本身检索的,我认为没有拼写或语义错误,那么为什么PostgreSQL 无论如何都会导致问题?在 pgAdmin4 中运行查询或使用建议的 countries.Continent 是有效的。

我的 PostgreSQL 版本是目前最新的:

$ psql --version
psql (PostgreSQL) 9.6.1

如何才能成功运行查询?

【问题讨论】:

PostgreSQL 区分大小写 @wingedpanther:如果您使用那些可怕的带引号的标识符,它区分大小写。 不相关,但是:psql --version 为您提供psql 的版本,而不是服务器的版本 PostgreSQL column 'foo' does not exist的可能重复 【参考方案1】:

尝试将其放入双引号中 - 例如查询中的"Continent"

SELECT "Continent"
FROM network.countries
...

【讨论】:

啊,是的 :) 列名以大写字母开头,而其他列则没有。你的答案是正确的,它适用于引号 @BullyWiiPlaza:您应该重新考虑如何创建表格(您在创建表格时显然引用了名称)。一般来说,最好不要使用双引号 - 从长远来看,你会少很多麻烦 @a_horse_with_no_name:好吧,我没有设置那个数据库,但我必须使用它...... 您需要引用“Continent”以防止PostgreSQL将其转换为小写。见***.com/a/55297938/9450152【参考方案2】:

在使用 SQLAlchemy 环境时,我遇到了这样的 SQL 错误,

   db.session.execute(
    text('SELECT name,type,ST_Area(geom) FROM buildings WHERE type == "plaza" '))

错误:“广场”列不存在

好吧,我将 == 更改为 = ,错误仍然存​​在,然后我交换了引号,如下所示。有效。奇怪!

.... 
text("SELECT name,type,ST_Area(geom) FROM buildings WHERE type = 'plaza' "))

【讨论】:

这并不奇怪,SQL 就是这样工作的。单引号用于文字值,双引号用于带引号的标识符(列名、表名等)。【参考方案3】:

这个问题出现在 postgres 中,因为表名不是 tablename 而是“tablename”。 例如。 如果它将用户显示为表名, 比表名是“用户”。

看这个:

【讨论】:

其实我觉得这里不是这样的。出现问题是因为 OP 使用 'Continent' 作为列名,如果没有引用,PostgreSQL 会将所有名称转换为小写。见***.com/questions/55297807/…

以上是关于PostgreSQL“列不存在”但它确实存在的主要内容,如果未能解决你的问题,请参考以下文章

postgres 错误:Postgresql 11.6 中的列不存在错误

错误:关系列不存在 PostgreSQL,无法运行插入查询

选择多列时出现 ExecuteReader 错误“行/列不存在数据”

如果 PostgreSQL 上不存在,如何添加列?

数据存在,但我的程序显示“行/列不存在数据”。

Postgres 列不存在