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

k4ymrczo  于 2022-11-22  发布在  PostgreSQL
关注(0)|答案(5)|浏览(203)

我正在编写一个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中会出现“column does not exist”错误。我可以看到有一个名为Network的模式,其中包含表countries,该表中有一个名为Continent的列,正如所预期的那样。
既然所有的列名、模式名和表名都是由应用程序本身检索的,我不认为存在拼写或语义错误,那么为什么PostgreSQL会导致问题呢?在pgAdmin4中运行查询或使用建议的countries.Continent都是有效的。
我的PostgreSQL版本是目前最新的:

$ psql --version
psql (PostgreSQL) 9.6.1

如何成功运行查询?

llycmphe

llycmphe1#

请尝试将其用双引号括起来,例如查询中的"Continent"

SELECT "Continent"
FROM network.countries
...
aiqt4smr

aiqt4smr2#

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

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

错误:列“plaza”不存在
好吧,我改变了==,错误仍然存在,然后我交换了引号,如下所示。它的工作。奇怪!

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

h7appiyu3#

这个问题发生在postgres中,因为表名不是tablename,而是“tablename”。例如,如果它将用户显示为表名,那么表名是“user”。
请看:

3zwtqj6y

3zwtqj6y4#

当您在数据行名称中错误地加入空格(例如“users“)时,可能会发生这样的错误。

kd3sttzy

kd3sttzy5#

当我在RedShift中执行PIVOT时,我得到了同样的错误。

SELECT *
INTO output_table
FROM (
SELECT name, year_month, sales
FROM input_table
) 
PIVOT
(
SUM(sales)
FOR year_month IN ('nov_2020', 'dec_2020', 'jan_2021', 'feb_2021', 'mar_2021', 'apr_2021', 'may_2021', 'jun_2021', 'jul_2021', 'aug_2021',
                  'sep_2021', 'oct_2021', 'nov_2021', 'dec_2021', 'jan_2022', 'feb_2022', 'mar_2022', 'apr_2022', 'may_2022', 'jun_2022',
                  'jul_2022', 'aug_2022', 'sep_2022', 'oct_2022', 'nov_2022')
)

我尝试了不带引号的year_month(出现错误),带双引号的year_month(出现错误),最后带单引号的year_month(这次成功了)。如果有人在同样的情况下喜欢我的例子,这可能会有所帮助。

相关问题