2016-08-04 15 views
2

私はPostgreSQL 9.5.3を使用しています.20歳以上のすべてのユーザーを選択しようとしています。列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:

012私はエラーを示しSQLFiddleを構築しました
ERROR: column "age" does not exist Position: 77 

ことがFirebaseによってデフォルトだと、私の日付はすべてmillisecondsを使用して保存されているので、私は1000でdevidingてる理由があります。この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'; 

説明:

  • あなたが必要to_timestampはdoubleを受け入れるだけなので、生年月日/ 1000を倍精度にするには 。
  • フィルタリング時に、age関数がintervalを返すため、20の代わりに20 yearsを使用する必要があります。 where句はselect句の前に、実行されたとき
+0

その場合、倍精度にキャストを削除します。 – cungiderm

1

ageエイリアスがまだ存在しません。 1つの解決策は、外部クエリのを確認することです。

select * 
from (
    select u.*, 
     extract(year from age(to_timestamp(u.birthdate/1000))) as age 
    from users u 
) s 
where age > 20 
関連する問題