MySQL - 我如何计算空值而不是空值?

Posted

技术标签:

【中文标题】MySQL - 我如何计算空值而不是空值?【英文标题】:MySQL - How Do I Count Nulls and Not Nulls? 【发布时间】:2012-03-03 22:35:02 【问题描述】:

我有一个简单的安装量表

prod_code 电子邮件 安装槽

如果 install_slot 为 NULL,那么它是一个可用的安装槽。不为空 - 然后,使用插槽。我需要返回给定产品和电子邮件的总安装结果,以及给定产品和电子邮件的已用安装结果。我想我可以用两个查询来做到这一点,但想知道是否有一种 SQL 方法可以将这一切合二为一?

我尝试了以下作为一个疯狂的猜测,但它不起作用

SELECT
    i1.`prod_code`,
    COUNT(i1.`email`) AS total_installs,
    COUNT(ISNULL(i2.`install_slot`)) AS used_installs
FROM
    `installs` AS i1
JOIN
    `installs` AS i2
ON
    i1.`prod_code` = i2.`prod_code`
WHERE
    i1.`email` = 'example@example.com'
GROUP BY
    i1.`prod_code`,i2.`prod_code`

【问题讨论】:

我不懂你,Lightness。以“我猜”开头的带问号的句子的哪一部分你不明白? 没有。我不是在说那句话,是吗? 嗯?我还是不关注你。 我仍然没有发现你的 cmets 很有建设性。我的反对意见也被赞成,在你抱怨我的问题风格不清楚的 1 分钟内,我实际发布问题的 2 分钟内,有人轻松抓住了问题并解决了问题。我的意思是,至少我展示了我尝试过的东西,而且我的测试用例并没有涉及很多脑力来理解。我的意思是,拜托,你是一个 C++ 程序员——你见过更难的问题。 我没有说这个问题很难;甚至没有一次。我试图训练您摆脱说“它不起作用”而不是描述程序行为并将其与您想要的行为进行比较的不良习惯。一个编程问题应该永远包含“它不起作用”的字眼。但我已经放弃了。 【参考方案1】:
SELECT prod_code,
       COUNT(email) AS total_installs,
       COUNT(install_slot) AS used_installs
FROM installs
WHERE email='example@example.com'
GROUP BY prod_code

COUNT 仅计算 NOT NULL 值。

【讨论】:

哇。我很惊讶这实际上奏效了。在我看来,这似乎行不通,但确实可行。 @Lightness Races in Orbit:说“它有效”也是一个坏习惯吗?【参考方案2】:

提供的解决方案对我不起作用。我不得不修改如下:

SELECT prod_code,
       COUNT(NULLIF(email,'')) AS total_installs,
       COUNT(NULLIF(install_slot,'')) AS used_installs
FROM installs
WHERE email='example@example.com'
GROUP BY prod_code

【讨论】:

可能是因为电子邮件不是空的,而是空字符串。通过执行nullif ,您将空字符串转换为空值。因此count() 不算数

以上是关于MySQL - 我如何计算空值而不是空值?的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬返回默认值而不是空值

用 phpunit 模拟 symfony 安全,返回空值而不是布尔值(不使用预言)

haskell enum - 如果值构造函数需要值而不是空值,该怎么办?给出了需求场景

选择非空值而不使用非空值

由于空值而无法评估绑定时使用默认值

在 XSLT 代码中从 csv 读取空值而不移动单元格值