2017-08-30 49 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過濾器不使用。它還返回在不同時間創建的記錄。我怎樣才能解決這個問題?有

+2

或者需要括號我想 –

+0

我試過,但沒有解決問題。 –

+1

也是'4爲空'總是虛假的,所以在與其他AND相同的組中有這樣的事情使整個組成爲假... –

回答

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使用一個明確的時間戳來寫,並將邏輯簡化爲:

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

多個AND和一個或做出任何的where子句工作, 你需要組子句括號,水木清華這樣的:

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)