如果两列为 0,我如何 return 清空?

How do I return empty if two columns are 0?

我有以下查询:

SELECT a.timestamp AS start, a.timestamp + (1 * INTERVAL '1 hour') AS end,
                           count_1, count_2                              
FROM (
    SELECT time_bucket_gapfill(CAST(1 * INTERVAL '1 hour' AS INTERVAL), time) AS timestamp,
    COALESCE(COUNT(DISTINCT CASE WHEN type IN ('Type 1') THEN time END), 0) count_1,
    COALESCE(COUNT(DISTINCT CASE WHEN type IN ('Type 2') THEN time END), 0) count_2
    FROM info
    JOIN person USING (id)
    WHERE time >= '2022-04-29 22:00:00.0'
        AND time < '2022-04-30 22:00:00.0'
    GROUP BY timestamp) a
ORDER BY a.timestamp ASC

查询给了我这样的信息:

|        start        |          end        | count_1 | count_2 |
-----------------------------------------------------------------
| 2022-04-29 22:00:00 | 2022-04-29 23:00:00 |    0    |    0    |
| 2022-04-29 23:00:00 | 2022-04-30 00:00:00 |    0    |    0    |
| 2022-04-30 00:00:00 | 2022-04-30 01:00:00 |    0    |    0    |
| 2022-04-30 01:00:00 | 2022-04-30 02:00:00 |    0    |    0    |
| 2022-04-30 02:00:00 | 2022-04-30 03:00:00 |    0    |    0    |
...

我唯一想知道的是是否有一种方法可以说明如果 count_1 和 count_2 中的所有行都是 0,那么就不要 return 任何东西。我只想返回一个空结果。这可能吗?

您可以在下面添加 WHERE EXISTS 条件以检查是否有任何记录具有 count_1 和 count_2 的 1-0、1-1 或 0-1 值返回。

WHERE EXISTS (SELECT 1 
    FROM (
        COALESCE(COUNT(DISTINCT CASE WHEN type IN ('Type 1') THEN time END), 0) count_1,
        COALESCE(COUNT(DISTINCT CASE WHEN type IN ('Type 2') THEN time END), 0) count_2
        FROM info JOIN person USING (id)
        WHERE time >= '2022-04-29 22:00:00.0'
              AND time < '2022-04-30 22:00:00.0'
        GROUP BY timestamp) ip 
    WHERE count_1 <> 0 OR count_2 <> 0)

你可以把子查询a放到一个WITH查询中,然后使用另一个基于此的子查询过滤掉结果如

WITH a AS
(
 SELECT time_bucket_gapfill(CAST(1 * INTERVAL '1 hour' AS INTERVAL),
                            time) AS timestamp,
        COALESCE(COUNT(DISTINCT CASE
                         WHEN type IN ('Type 1') THEN
                          time
                       END),
                 0) count_1,
        COALESCE(COUNT(DISTINCT CASE
                         WHEN type IN ('Type 2') THEN
                          time
                       END),
                 0) count_2
   FROM info
   JOIN person
  USING (id)
  WHERE time >= '2022-04-29 22:00:00.0'
    AND time <  '2022-04-30 22:00:00.0'
  GROUP BY timestamp
)
SELECT timestamp AS start, timestamp + (1 * INTERVAL '1 hour') AS "end",
       count_1, count_2                              
  FROM a
 WHERE (SELECT SUM(count_1+count_2) FROM a)!=0  
ORDER BY a.timestamp ASC