X列不存在。 (按功能创建列)

时间:2016-08-04 12:36:33

标签: postgresql

我正在使用PostgreSQL 9.5.3而我正在尝试选择年龄超过20岁的所有用户。我构建了一个显示错误的SQLFiddle:

http://sqlfiddle.com/#!15/5cd52/3

片段:

架构:

    var outputString = ""
    let valueString = "9,58,888.875"
    let valueFormatter = NSNumberFormatter()
    let outputFormatter = NSNumberFormatter()
    outputFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
    valueFormatter.numberStyle = NSNumberFormatterStyle.SpellOutStyle
    outputString = valueFormatter.stringFromNumber(outputFormatter.numberFromString(valueString as String)!)!
    print(outputString)

SQL:

CREATE TABLE users (
  name text,
  birthdate bigint
);

INSERT INTO users values('Chris', 774532800000);

ERROR:

SELECT u.*, age(TO_TIMESTAMP(u.birthdate / 1000)) as age from users u
WHERE age > 20

我偏离1000的原因是因为我的日期都是使用ERROR: column "age" does not exist Position: 77 存储的,因为这是Firebase的默认日期。这个postgreSQL数据库用于处理Firebase无法处理的更复杂的查询。

2 个答案:

答案 0 :(得分:1)

age子句执行where子句之前,select别名仍然不存在。一种解决方案是检查外部查询中的age

select *
from (
    select u.*,
        extract(year from age(to_timestamp(u.birthdate / 1000))) as age
    from users u
) s
where age > 20

答案 1 :(得分:0)

修改 正如@Clodoaldo Neto所建议的那样(我是新手,不知道如何标记),这里是:

SELECT *
FROM staging.users u 
WHERE age(to_timestamp(u.birthdate / 1000)) > '20 years';

说明:

  • 你需要将生日/ 1000投两分 因为to_timestamp只接受double。
  • 然后在过滤时,您需要使用'20年'而不是20,因为年龄函数会返回间隔。