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…这并不能解决问题,查询仍然返回无效数据。这并不能解决问题,查询仍然返回无效数据。