如何在SQL查询中检查子查询中值的出现

时间:2018-11-13 17:07:31

标签: sql postgresql group-by count subquery

我有一个带有子查询的PostgreSQL查询。 子查询和返回的数据如下:

SELECT i.item_id,
       i.updated_date,
       i.quantity
FROM   items i
WHERE  item IN (1675, 1676);

   item    |   updated_date   |   quantity
===========================================
  1675     |     2018-05-01   |      100
  1676     |     2018-05-01   |       0

如果1列的COUNT不为0,并且任何updated_date值为0,我需要主查询返回quantity。通过以下方式遇到困难:

SELECT   CASE WHEN COUNT(item_subquery.update_date) !=0
              AND /* Can't figure out what to put here*/
              THEN 1
              ELSE 0
         END as check_data

FROM     (SELECT i.item_id,
                 i.updated_date,
                 i.quantity
          FROM   items i
          WHERE  item IN (1675, 1676)) item_subquery

我尝试将CASE语句中的注释替换为item_subquery.quantity = 0,但这不起作用,我部分理解了原因。我很难概念化该怎么做。

我该如何检查子查询的quantity列中的任何值是否为0,并将其合并到我的case语句中?

答案

我能弄清楚这一点,以防万一有人在寻找答案。您可以在计数函数中添加FILTER函数,以缩小精确计数的范围。这就是我最初寻找的查询的样子:

SELECT   CASE WHEN COUNT(item_subquery.update_date) !=0
              AND COUNT(item_subquery.quantity) FILTER(item_subquery.quantity = 0) > 0
              THEN 1
              ELSE 0
         END as check_data

FROM     (SELECT i.item_id,
                 i.updated_date,
                 i.quantity
          FROM   items i
          WHERE  item IN (1675, 1676)) item_subquery

1 个答案:

答案 0 :(得分:2)

在Postgres中,很容易将布尔值转换为数字。因此,您可以将逻辑编写为:

SELECT (SUM( (quantity = 0)::int) > 0 AND COUNT(updated_date) > 0)::int
FROM items i
WHERE item IN (1675, 1676);

这又可以简化为:

SELECT ( SUM( (quantity = 0)::int ) > 0)::int
FROM items i
WHERE item IN (1675, 1676);

您可以根据需要使用子查询,但这不是必需的。