2017-08-30 7 views
1

で検索する場合、私は次のクエリを持っている:PostgreSQLの誤った結果のcreated_at

SELECT 
    COUNT(sr.id) AS total, 
    COUNT(sr.id) FILTER (where (raw #>> '{survey, declined}' IS NULL) OR (raw #>> '{survey, declined}' = 'false')) AS completed, 
    COUNT(sr.id) FILTER (WHERE (raw #>> '{survey, declined}' = 'true')) AS denied 
FROM survey_results sr 
LEFT JOIN clients c ON c.id = sr.client_id 
LEFT JOIN facilities f ON f.client_id = c.id 
WHERE 
    sr.created_at >= '2005-07-01T08:00:00+00:00' AND 
    sr.created_at <= '2005-08-02T07:59:59+00:00' AND 
    4 IS NULL OR sr.client_id = 4 AND 
    NULL IS NULL OR f.id = NULL 
; 

問題は、これらのcreated_atフィルタが使用されていないということです。また、異なる時間に作成されたレコードも返します。これをどうすれば解決できますか?あなたは、ブラケットとグループ句に必要 、複数のANDおよび1つを有するまたはWHERE句の作業のいずれかを作る

+2

OR私は –

+0

が、私はそれを試してみましたが、問題を解決しないと仮定し、ブラケットを必要とします。 –

+1

でも '4 is null'は常にfalseなので、他のANDと同じグループに属することは、グループ全体をfalseにします。 –

答えて

2

あなたが括弧を必要とする:

WHERE (sr.created_at >= '2005-07-01T08:00:00+00:00' AND 
     sr.created_at <= '2005-08-02T07:59:59+00:00' 
    ) AND 
     (4 IS NULL OR sr.client_id = 4) AND 
     (NULL IS NULL OR f.id = NULL) 

必要はありませんが、私はtzを使って明示的なタイムスタンプを使ってtisを書いて、論理を単純化して次のようにします:

WHERE (sr.created_at >= '2005-07-01T08:00:00+00:00'::timestamptz AND 
     sr.created_at < '2005-08-02T08:00:00+00:00'::timestamptz 
    ) AND 
     (4 IS NULL OR sr.client_id = 4) AND 
     (NULL IS NULL OR f.id = NULL) 
1

、のようになめらか:

SELECT 
    COUNT(sr.id) AS total, 
    COUNT(sr.id) FILTER (where (raw #>> '{survey, declined}' IS NULL) OR (raw #>> '{survey, declined}' = 'false')) AS completed, 
    COUNT(sr.id) FILTER (WHERE (raw #>> '{survey, declined}' = 'true')) AS denied 
FROM survey_results sr 
LEFT JOIN clients c ON c.id = sr.client_id 
LEFT JOIN facilities f ON f.client_id = c.id 
WHERE 
    (sr.created_at >= '2005-07-01T08:00:00+00:00' AND 
    sr.created_at <= '2005-08-02T07:59:59+00:00' AND 
    4 IS NULL) 
    OR 
    (sr.client_id = 4 AND 
    NULL IS NULL OR f.id = NULL) 
; 
+0

これで問題は解決されず、クエリは無効なデータを返します。 –

1

4 IS NULLNULL IS NULLを取り外し、ブラケットを使用します。

WHERE (sr.created_at >= '2005-07-01T08:00:00+00:00' AND 
    sr.created_at <= '2005-08-02T07:59:59+00:00') 
    AND 
    (sr.client_id = 4 OR f.id = NULL) 
関連する問題