2017-12-14 9 views
1

予想通り、私は次の通知表を持っている:Postgresのクエリ複数

| id (PK - INT) | user_id (UUID) | text (Text) | show_after (Date) default NULL | 

私はTODOを望むてることはuser_idのためのすべてのnotifsを選択している、私はまた、我々を確保したいですshow_afterの日付が未来のところにnotifsを表示しないでください。

5日後に通知を表示する場合は、show_after = NOW() + 5 daysと設定します。

なんらかの理由で私がセットアップしたクエリは奇妙な動作をしており、notifのいくつかは将来show_afterの日付が設定されていますが、いつshow_after ===いつでも通知を返します。ここで

は、私が試したクエリは次のとおりです。

select * from activities where user_id = '<uuid>' OR show_after = null AND 
show_after <= NOW(); 

また、私は成功せず、OR /論理積の周りに切り替えてみました。

答えて

1

あなたは値がない場合はSQLにあなたが判断するためにIS NULLを使用する必要があります。また

select * from activities 
where user_id = '<uuid>' 
and (
    show_after <= NOW() 
    OR 
    show_after IS NULL 
    ) 
; 

ロジックを制御するために、括弧を必要としています。等号を使用すると機能しません(NULL = NULLは常にfalseです)。

+0

恐ろしい!私は日付のクエリを 'show_after <= NOW()'(<=)に変更しました(私の質問でこれを更新しました) – James111

+1

'<='は意味があります。乾杯。将来の照会では、それを制限するためにかっこで予期しない影響を及ぼす可能性があるため、常に「または」の目に留まります。 –