我有一个包含子查询的 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
如果 updated_date
列的 COUNT
不为 0,并且 中的任何一个,我需要主查询返回
值为 0。我在思考这个问题时遇到了麻烦:1
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
我尝试用 item_subquery.quantity = 0
替换我在 CASE
语句中的注释,但这不起作用,我部分理解原因。我很难构思如何执行此操作。
我将如何检查我的子查询的 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
最佳答案
在 Postgres 中,很容易将 bool 值转换为数字。因此,您可以将逻辑编写为:
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);
如果需要,您可以使用子查询,但这不是必需的。
关于sql - 如何检查 SQL 查询中子查询中值的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53286199/