PostgreSQL查询报错:已存在的createdAt列提示不存在
PostgreSQL列名大小写问题导致查询错误解决方法
问题场景
数据表spaces中存在名为createdAt的列,但执行以下查询语句时,提示spaces.createdat不存在:
SELECT date_trunc('week', spaces.createdAt ) as start_of_week, sum(spaces.rent_amount) FROM spaces GROUP BY date_trunc('week', spaces.createdAt ) ORDER BY date_trunc('week', spaces.createdAt )
报错信息:
Error in query (7): ERROR: column spaces.createdat does not exist
LINE 1: SELECT date_trunc('week', spaces.createdAt ) as start_of_wee...
HINT: Perhaps you meant to reference the column "spaces.createdAt".
原因分析
PostgreSQL对标识符(列名、表名等)的大小写处理规则:
- 未用双引号包裹的标识符,会被自动转换为小写处理
- 如果创建列时使用双引号定义了大小写混合的列名(如
"createdAt"),后续查询该列时必须用双引号包裹,否则PostgreSQL会去查找小写的createdat列,自然找不到目标列
解决方法
将查询语句中所有引用createdAt列的地方用双引号包裹,修正后的语句如下:
SELECT date_trunc('week', spaces."createdAt" ) as start_of_week, sum(spaces.rent_amount) FROM spaces GROUP BY date_trunc('week', spaces."createdAt" ) ORDER BY date_trunc('week', spaces."createdAt" )
预防建议
- 如果不需要区分列名大小写,创建表时不要用双引号定义列名,让PostgreSQL自动转为小写,后续查询无需加引号即可正常访问
- 如果必须保留大小写混合的列名,所有涉及该列的SQL语句都要记得用双引号包裹列名
内容的提问来源于stack exchange,提问作者A A Maruf
相关产品推荐
相关产品推荐

