繁体   English   中英

通过created_at搜索时,PostgreSQL的结果不正确

[英]PostgreSQL incorrect results when searching by 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过滤器。 它还返回在不同时间创建的记录。 我怎样才能解决这个问题?

您需要括号:

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)

具有多个AND和一个OR可使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)
;

删除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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM