【问题标题】:How do I check the occurrence of a value from a subquery in a SQL query如何检查 SQL 查询中子查询中值的出现
【发布时间】:2018-11-13 17:07:30
【问题描述】:

我有一个包含子查询的 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,并且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 替换我在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

【问题讨论】:

  • 什么the COUNT of the updated_date column is not 0??你能举例说明什么时候要返回 0,什么时候要返回 1?
  • @JuanCarlosOropeza 在上面的帖子中,查看子查询的结果。其中一行 (item = 1676) 在数量列中有一个 0。我希望我的主查询检查子查询的数量列中的任何值是否为 0。
  • 是的,但不确定您为什么说日期计数?你有空日期?我也想要两者的例子,当你想要 0 和当你想要 1 使逻辑更清晰时
  • 我只需要计算日期,但这不是问题所在。如果COUNT(created_date) 不等于0 并且子查询中quantity 字段行的any 为0,我只需要我的主查询的CASE 语句返回1。
  • 你很固执吧?我可以慢慢来,但根据我的经验,如此小的样本数据可以用不同的逻辑解释并带来期望的结果。所以我不想花时间试图解决一个问题,然后被告知那不是你想要的。所以请向我们展示当你得到 1 和当你得到 0 的两种情况。再一次为什么 count(created_date) ?该字段可以为空吗?

标签: sql postgresql group-by count subquery


【解决方案1】:

在 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。
  • 戈登不确定这一点。如果任何数量 = 0,则 SUM( (quantity = 0)::int) 大于 0,因此比较为假,OP 希望在这种情况下返回 1
  • @JuanCarlosOropeza 。 . .谢谢你。我认为你的解释是正确的。
  • 我不确定简化版。因为您查询的是多个数量为 0 的不同日期,所以您的 SUM 可能大于 0。除非您转换为布尔值并返回整数。
  • 我用答案更新了我原来的帖子。您可以将 FILTER 函数添加到您的 COUNT 函数以缩小计数范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多