我有一个带有子查询的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
答案 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);
您可以根据需要使用子查询,但这不是必需的。