如何在SQL查询中检查子查询中的值是否出现
我有一个PostgreSQL查询,它有一个子查询。子查询和返回的数据如下所示:如何在SQL查询中检查子查询中的值是否出现,sql,postgresql,group-by,count,subquery,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 | 20
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\u date
列的COUNT
不是0,并且任何quantity
值都是0,我需要主查询返回1
。我很难想清楚这一点:
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
替换案例
语句中的注释,但这不起作用,我部分理解原因。我很难构思如何做到这一点
如何检查子查询的quantity
列中是否有任何值为0,并将其合并到case语句中
答复
我能找到答案,以防万一有人在寻找答案。您可以在count函数中添加一个过滤器
函数,以缩小精确计数的范围。以下是我最初寻找的查询的外观:
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中,很容易将布尔值转换为数字。因此,您可以将逻辑编写为:
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);
如果需要,可以使用子查询,但这不是必需的。在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);
如果需要,可以使用子查询,但这不是必需的。我不需要将布尔值转换为数字。我需要弄清楚如何检查子查询的
quantity
列中是否有0。Gordon对此不确定。如果任何数量=0,则总和((数量=0)::int)
大于0,因此比较为假,OP希望在该值上返回1case@JuanCarlosOropeza . . . 非常感谢。我认为你的解释是正确的。我对简化版不太清楚。因为您要查询多个数量为0的不同天数,所以您的总和可以大于0。除非你把它转换成布尔值,然后再转换成整数。我用答案更新了我原来的帖子。您可以在COUNT
函数中添加FILTER
函数,以缩小计数范围。我不需要将布尔值转换为数字。我需要弄清楚如何检查子查询的quantity
列中是否有0。Gordon对此不确定。如果任何数量=0,则总和((数量=0)::int)
大于0,因此比较为假,OP希望在该值上返回1case@JuanCarlosOropeza . . . 非常感谢。我认为你的解释是正确的。我对简化版不太清楚。因为您要查询多个数量为0的不同天数,所以您的总和可以大于0。除非你把它转换成布尔值,然后再转换成整数。我用答案更新了我原来的帖子。您可以在COUNT
函数中添加一个FILTER
函数,以缩小计数范围。更新日期列的计数不是0是什么意思??你能举例说明何时返回0,何时返回1吗?@JuanCarlosOropeza在上面的帖子中,查看子查询的结果。其中一行(item=1676)的“数量”列中有一个0。我希望我的主查询检查子查询的“数量”列中的任何值是否为0。是,但不确定您为什么说“日期计数”?你有空日期吗?我还想举两个例子,当你想要0,当你想要1,使逻辑更清晰,我只需要计算日期,但这不是什么给我的问题。如果COUNT(created_date)
不等于0,并且子查询中的quantity
字段行中的任何一行都是0,我只需要主查询的CASE语句返回1。你很固执,是吗?我可以花点时间去做,但根据我的经验,如此小的样本数据可以用不同的逻辑进行解释,并带来期望的结果。所以我不想花时间试图解决一个问题,然后被告知这不是你想要的。所以当你得到1和0时,请向我们展示这两种情况。再说一遍,为什么计数(创建日期)??该字段可以为空吗?更新日期列的计数不是0意味着什么??你能举例说明何时返回0,何时返回1吗?@JuanCarlosOropeza在上面的帖子中,查看子查询的结果。其中一行(item=1676)的“数量”列中有一个0。我希望我的主查询检查子查询的“数量”列中的任何值是否为0。是,但不确定您为什么说“日期计数”?你有空日期吗?我还想举两个例子,当你想要0,当你想要1,使逻辑更清晰,我只需要计算日期,但这不是什么给我的问题。如果COUNT(created_date)
不等于0,并且子查询中的quantity
字段行中的任何一行都是0,我只需要主查询的CASE语句返回1。你很固执,是吗?我可以花点时间去做,但根据我的经验,如此小的样本数据可以用不同的逻辑进行解释,并带来期望的结果。所以我不想花时间试图解决一个问题,然后被告知这不是你想要的。所以当你得到1和0时,请向我们展示这两种情况。再说一遍,为什么计数(创建日期)??该字段可以为空吗?