2016-08-04 1 views
2

Я использую PostgreSQL 9.5.3, и я пытаюсь выбрать всех пользователей, которым исполнилось более двадцати. Я построил SQLFiddle, который показывает ошибку:Столбец X не существует. (Создан столбцом по функциям)

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

SNIPPET:

Схема:

CREATE TABLE users (
    name text, 
    birthdate bigint 
); 

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

SQL:

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

ОШИБКА:

ERROR: column "age" does not exist Position: 77 

Причина, по которой я разделяющая на 1000, потому что мои даты все хранятся с использованием milliseconds, как это по умолчанию, Firebase. Эта база данных postgreSQL используется для обработки более сложных запросов, которые Firebase не смог.

+0

Является ли это Postgresql или MySQL? –

+0

Я предполагаю, что псевдоним для столбца не может использоваться в условии where, потому что этот столбец не будет оцениваться во время фильтрации. – user4658312

ответ

0

EDIT Как было предложено @Clodoaldo Нето (я новичок, не знаю, как помечать), здесь:

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

Объяснение:

  • Вам нужно придать дату рождения/1000 удвоить , потому что to_timestamp только принять двойной.
  • Затем при фильтрации вам нужно использовать «20 лет» вместо 20, потому что функция возрастает с интервалом.
+0

В этом случае удалите бросок с двойной точностью. – cungiderm

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 
Смежные вопросы