代码之家  ›  专栏  ›  技术社区  ›  Mateusz Urbański

PostgreSQL在按created\u搜索时结果不正确

  •  1
  • Mateusz Urbański  · 技术社区  · 9 年前

    我有以下疑问:

    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
    ;
    

    问题是没有使用在过滤器上创建的过滤器。它还返回在不同时间创建的记录。我怎样才能解决这个问题?

    3 回复  |  直到 9 年前
        1
  •  2
  •   Gordon Linoff    9 年前

    需要括号:

    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)
    
        2
  •  1
  •   Vao Tsun    9 年前

    有多个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)
    ;
    
        3
  •  1
  •   TOUZENE Mohamed Wassim    9 年前

    去除 4 IS NULL 和 NULL 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)