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

时间:2017-01-11 12:47:28

标签: sql postgresql quoted-identifier

我正在编写一个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

如何成功运行查询?

3 个答案:

答案 0 :(得分:16)

尝试将其引入双引号 - 例如查询中的ggplot(df, aes(Year, Degrees)) + stat_summary(fun.y = mean, fun.ymin = min, fun.ymax = max, col = 'red')

"Continent"

答案 1 :(得分:0)

在使用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' "))

答案 2 :(得分:0)

发生此问题的原因是在pgAdmin3中,因为表名不是表名,而是表名。 例如 如果显示用户为表名, 表名称是“用户”。

看到这个:

image for table user