【问题标题】:Using IFNULL to set NULLs to zero使用 IFNULL 将 NULL 设置为零
【发布时间】:2011-10-12 06:59:58
【问题描述】:

我有一个表,其中一个字段包含一个整数或NULL

parent_id
2
4
6
NULL
NULL
45
2

我将如何添加一个 IFNULL 语句以便ans_count 将填充0 而不是NULL

这是我的 SQL 代码:

...
(SELECT parent_id AS pid, COUNT(*) AS ans_count
   FROM qa
  GROUP BY parent_id) AS n

更新

下面的完整 SQL - 感谢大家的耐心等待。

SELECT  *
FROM    qa
        JOIN user_profiles
          ON user_id = author_id
        LEFT JOIN (SELECT cm_id,
                          cm_author_id,
                          id_fk,
                          cm_text,
                          cm_timestamp,
                          first_name AS cm_first_name,
                          last_name AS cm_last_name,
                          facebook_id AS cm_fb_id,
                          picture AS cm_picture
                    FROM  cm
                    JOIN  user_profiles
                      ON  user_id = cm_author_id) AS c
          ON id = c.id_fk
        LEFT JOIN (SELECT   parent_id AS pid, COUNT(*) AS ans_count
                     FROM   qa
                    GROUP   BY parent_id) AS n
          ON id = n.pid
WHERE   id  LIKE '%'
ORDER   BY id DESC

【问题讨论】:

  • 在没有反馈或建议的情况下投反对票?非常感谢
  • 我没有投反对票,但您的描述令人困惑。它显示了一个名为 parent_id 的列,其中包含 NULL,但稍后您将讨论为不同的列消除 NULL,ans_count。更令人困惑的是,您的代码 sn-p 包含两者。
  • 同意 - 很抱歉造成混乱 - 刚刚发布了完整的 SQL,如果需要更多信息,请告诉我
  • 感谢您提供完整的查询,这解释了所有的困惑。有关详细信息,请参阅我的更新答案

标签: mysql sql ifnull


【解决方案1】:

编辑:基于完整查询的新信息

在您指定的查询中计数可以为空的原因是左连接将在不匹配的记录上返回空值。所以子查询本身没有返回空计数(因此所有的响应和混乱)。需要在最外层的select中指定IFNULL,如下:

SELECT  qa.*, user_profiles.*, c.*, n.pid, ifnull(n.ans_count, 0) as ans_count
FROM    qa
        JOIN user_profiles
          ON user_id = author_id
        LEFT JOIN (SELECT cm_id,
                          cm_author_id,
                          id_fk,
                          cm_text,
                          cm_timestamp,
                          first_name AS cm_first_name,
                          last_name AS cm_last_name,
                          facebook_id AS cm_fb_id,
                          picture AS cm_picture
                    FROM  cm
                    JOIN  user_profiles
                      ON  user_id = cm_author_id) AS c
          ON id = c.id_fk
        LEFT JOIN (SELECT   parent_id AS pid, COUNT(*) AS ans_count
                     FROM   qa
                    GROUP   BY parent_id) AS n
          ON id = n.pid
WHERE   id  LIKE '%'
ORDER   BY id DESC

旧响应

您能否更详细地解释您所看到的以及您期望看到的? Count 不能返回 NULL。

运行这组查询,您会看到计数始终为 2。您可以更改 NULL parent_id 的显示方式(为 NULL 或 0),但计数本身将始终返回。

create temporary table if not exists SO_Test(
    parent_id int null);

insert into SO_Test(parent_id)
select 2 union all select 4 union all select 6 union all select null union all select null union all select 45 union all select 2;


SELECT IFNULL(parent_id, 0) AS pid, COUNT(*) AS ans_count
   FROM SO_Test
  GROUP BY IFNULL(parent_id, 0);

SELECT parent_id AS pid, COUNT(*) AS ans_count
   FROM SO_Test
  GROUP BY parent_id;

drop table SO_Test;

【讨论】:

  • 我的想法完全正确。但是我已经通过将它提供给您的原始答案而破坏了我的支持。对不起。 :)
  • 感谢@derek,现在工作正常 - 抱歉没有早点发布完整代码
【解决方案2】:

我没有对此进行测试,但我认为它会起作用

(SELECT IF( parent_id IS NULL, 0, parent_id) AS pid, COUNT(*) AS ans_count
   FROM qa
  GROUP BY parent_id) AS n

【讨论】:

  • OP 希望 ans_count 为 0 而不是 null,所以您不希望 IF( COUNT(*) IS NULL, 0, COUNT(*)) AS ans_count 吗?
  • 这也返回 NULL 而不是 0 - 我非常确信这是由于在没有组的情况下使用 GROUP BY(b/c 它包含 NULL)
【解决方案3】:

只需将其包裹在您的陈述中:

IFNULL( 
  (SELECT parent_id AS pid, COUNT(*) AS ans_count
   FROM qa
   GROUP BY parent_id)
 , 0
) AS n

【讨论】:

  • 在 sql(在 oracle 数据库中)我了解到,在子查询中我们只能填充一个值......它在 mysql 中也适用或受到限制吗???
  • SELECT IFNULL( ( SELECT NULL FROM DUAL ), 0 ) AS n; 这样的语句有效,所以语法错误是由其他原因引起的
  • 该错误是由于您将IFNULL 应用于返回多列的子选择。
【解决方案4】:

你试过只计算 parent_id 吗?

(SELECT parent_id AS pid, COUNT(parent_id) AS ans_count
   FROM qa
  GROUP BY parent_id)

【讨论】:

    【解决方案5】:
    SELECT IFNULL(parent_id, 0) AS pid, COUNT(IFNULL(parent_id, 0)) AS ans_count
    FROM qa
    GROUP BY IFNULL(parent_id, 0)
    

    【讨论】:

      【解决方案6】:

      您能否发布展示您所谈论行为的实际数据和完整查询?根据我的经验,COUNT(*) 永远不能为 NULL。

      Can Count(*) ever return null?

      Does COUNT(*) always return a result?

      【讨论】:

      • 这种行为可能是因为GROUP BY? -- 显然在这种情况下 COUNT 可能会返回 NULL 而我需要它来返回零
      • @torr - COUNT 只能返回 0 或 GROUP 的数字。 NULL COUNT 是什么意思?同样,我建议您提供一个最小的可重现数据集和实际代码。
      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 2010-09-13
      • 2023-01-11
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      相关资源
      最近更新 更多