DB2 SELECT COUNT,如果为 NULL,则默认为 0

Posted

技术标签:

【中文标题】DB2 SELECT COUNT,如果为 NULL,则默认为 0【英文标题】:DB2 SELECT COUNT, if NULL then default to 0 【发布时间】:2014-11-07 15:06:16 【问题描述】:

目标

我正在尝试从一个表中选择一个用户 ID,并从 DB2 中的另一个表中选择相关项的计数。我正在尝试在 SSIS 中执行此查询以将数据导入 SQL Server 数据库,在该数据库中我将​​对数据执行其他转换过程。我提到 SSIS 不是因为我认为它是问题的一部分,而只是为了提供背景信息。我相当肯定问题在于我在 DB2 方面的经验不足。我的背景是 SQL Server,我对 DB2 很陌生。

问题

当(我假设)计数为 0 时会出现问题。当我在 DB2 命令编辑器中执行查询时,它只返回一个空白行。我希望它至少返回用户 ID,然后只有一个空白字段用于计数,但整行都是空白的。然后这会导致我的 SSIS 包出现问题,它试图在没有数据的情况下进行一堆插入。

再次重申,这是一个假设,因为我没有使用 DB2 命令编辑器或 DB2 的经验,但是如果我稍微打开日期,我会得到预期的结果(用户 ID 和计数)。

我尝试将计数包装在 COALESCE() 函数中,但这并没有解决问题。

查询

SELECT a.user_id, COUNT(DISTINCT b.item_number) as Count
FROM TABLE_A a
LEFT OUTER JOIN TABLE_B b
ON a.PRIMARY_KEY = b.PRIMARY_KEY
WHERE a.user_id = '1234'
AND b.DATE_1 >= '01/01/2013'
AND b.DATE_1 <= '01/05/2013'
AND b.DATE_2 >= '01/01/2013'
AND b.DATE_2 <= '12/23/2014'
AND a.OTHER_FILTER_FIELD = 'ABC'
GROUP BY a.user_id

【问题讨论】:

您的外连接实际上是一个内连接,因为您在连接之后 对 TABLE_B 应用谓词,因此不匹配的行被消除。将与日期相关的谓词放入连接条件中。 【参考方案1】:

将字段包装在 COALESCE() 中

 COUNT(DISTINCT COALESCE(b.item_number,0))

还要确定

 WHERE a.user_id = '1234'

存在于 TABLE_A 中。如果没有用户 1234,您将不会得到所写查询的结果。

【讨论】:

我已验证用户存在。如果我将日期分开,使它们相隔一年,我会得到预期的结果,但日期很窄,预期的计数可能为 0,我在 DB2 命令编辑器中只得到一个空白行。当我添加 COALESCE() 函数时也会发生这种情况。我会上传结果窗口的屏幕截图,但我没有足够的代表。结果窗口看起来很奇怪,因为列上没有您通常期望的边框,它只是一个空白的白色行。 我知道它在做什么。它看起来很奇怪,因为没有返回行。如果我做一个实际得到结果的查询,它会显示一个带有边框的正常外观记录,然后在其下方显示相同的白行,所以这是有道理的。我只是没有得到任何结果,这很奇怪。我希望至少得到 user_id 我认为您需要查看您的 where 子句。听起来你那里有一个错字。由于我不知道您要做什么,我不能说,但在我看来,如果更改日期会给您带来结果,那么您的 where 子句中的业务规则可能是错误的。 我已经将每个条件一个一个地添加到 where 子句中,只要项目存在,我就会得到一个计数。只要日期跨度足够窄到不存在任何项目,我就没有结果,所以我不认为它是 where 子句。 好的,让我看看我是否明白 -- 你想让COUNT() 返回 0?

以上是关于DB2 SELECT COUNT,如果为 NULL,则默认为 0的主要内容,如果未能解决你的问题,请参考以下文章

HIVE select count(*) 非 null 返回高于 select count(*) 的值

select count()和select count的区别

将常量与空集进行比较时,Db2 IN 谓词产生 NULL

Mysql 用SELECT count(*)效率高还是SELECT count(1)效率更高?

当 COUNT 小于 1 时返回 NULL

DB2 SQL Count over Union of multiple tables with different Datatype