PostgreSQL在以下位置创建搜索时结果不正确

PostgreSQL在以下位置创建搜索时结果不正确,sql,postgresql,Sql,Postgresql,我有以下疑问: 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}' = 'tru

我有以下疑问:

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
;

问题是没有使用在过滤器上创建的过滤器。它还返回在不同时间创建的记录。如何解决此问题?

使用多个AND和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)
;

具有多个AND和一个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)
;
你需要括号:

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)
你需要括号:

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)
删除4为NULL,NULL为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)
删除4为NULL,NULL为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)

或者需要括号,我想我试过了,但这并不能解决问题。同样,4为空总是错误的,所以在同一个组中有这样的东西,与其他AND使整个组为假…或者需要括号,我想我试过了,但这并不能解决问题。同样,4为空总是错误的,因此,将这些东西与其他AND放在同一个组中会使整个组为false…这并不能解决问题,查询仍然返回无效数据。这并不能解决问题,查询仍然返回无效数据。