Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL查询中检查子查询中的值是否出现_Sql_Postgresql_Group By_Count_Subquery - Fatal编程技术网

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

如何在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

我有一个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\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时,请向我们展示这两种情况。再说一遍,为什么计数(创建日期)??该字段可以为空吗?