【问题标题】:Column "date_norm" does not exist in Postgresql [duplicate]Postgresql中不存在列“date_norm”[重复]
【发布时间】:2018-03-13 02:53:24
【问题描述】:

我打算将我的数据从 sqlite3 移植到 PostgreSQL(10.1 版),但有些查询语句看起来与原始语句不兼容。例如,声明:

SELECT date+300 AS date_norm, close FROM History WHERE date_norm>1502681700;

在 sqlite3 中运行时,我得到:

错误:列“date_norm”不存在

LINE 1: ...T date+300 AS date_norm, close FROM History WHERE date_norm>...

我不知道该错误,感谢任何提示。提前致谢。

【问题讨论】:

    标签: postgresql column-alias


    【解决方案1】:

    现有查询存在问题,需要更改。

    SELECT "date"+300 AS date_norm, close 
    FROM History
    WHERE "date" > (1502681700-300);
    
    • 不能引用在 where 子句内的 select 子句中形成的 column alias。 SQL 的实际执行顺序与您编写 SQL 查询的方式不同。实际上 where 子句在 select 子句之前执行,因此 where 子句根本无法理解别名“date_norm”。而是参考源列“日期”并相应地修改您的过滤方式,这里我只是从您使用的常量值中扣除了 300。

    此外,date 是标准 SQL (refer) 中的“保留字”。您不应该使用保留字作为列名,或者您应该将该列名引用为“日期”(例如select "date" from History)。虽然它在 PostgreSQL 中不会造成问题,但它是一个潜在的可移植性问题。

    【讨论】:

    • 您的第 1 点是错误的 - 您链接到的页面表明 DATE 在标准 SQL 中保留,但在 PostgreSQL 中不是
    • 所提到的 SQL 标准可能是起源,但实现限制的是 Postgres。老实说,我觉得你过分严厉地暗示这是错误的。完全错误的“日期”并不是一个保留词,但我们知道它是。
    • PostgreSQL 确实以任何方式限制date 的使用。我并不是要粗鲁或苛刻,但在 PostgreSQL 中使用未引用的 date 作为名称没有问题。充其量,您应该建议最好避免使用标准 SQL 关键字,因为它们可能是移植问题。
    • 很好,我已经淡化了建议。谢谢。
    • 谢谢大家,感谢您的所有建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 2019-05-08
    • 2014-03-17
    • 2013-05-20
    • 2021-02-02
    • 2021-04-05
    相关资源
    最近更新 更多