当前位置:  开发笔记 > 后端 > 正文

如何返回按NULL和NOT NULL分组的记录?

如何解决《如何返回按NULL和NOTNULL分组的记录?》经验,为你挑选了6个好方法。

我有一个有processed_timestamp列的表- 如果已经处理了一个记录,那么该字段包含它被处理的日期时间,否则它是null.

我想写一个返回两行的查询:

NULL        xx -- count of records with null timestamps
NOT NULL    yy -- count of records with non-null timestamps

那可能吗?

更新:表格非常大,因此效率非常重要.我可以运行两个查询来分别计算每个总数,但是如果我可以避免它,我想避免两次击中表.



1> Stefan Gehri..:

在MySQL中你可以做类似的事情

SELECT 
    IF(ISNULL(processed_timestamp), 'NULL', 'NOT NULL') as myfield, 
    COUNT(*) 
FROM mytable 
GROUP BY myfield



2> Tomalak..:

在T-SQL(MS SQL Server)中,这适用于:

SELECT
  CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END FieldContent,
  COUNT(*) FieldCount
FROM
  TheTable
GROUP BY
  CASE WHEN Field IS NULL THEN 'NULL' ELSE 'NOT NULL' END



3> trunkc..:

甲骨文:

nvl2分组(字段,'NOT NULL','NULL')



4> paxdiablo..:

尝试以下,它是供应商中立的:

select
    'null    ' as type,
    count(*)   as quant
    from       tbl
    where      tmstmp is null
union all
select
    'not null' as type,
    count(*)   as quant
    from       tbl
    where      tmstmp is not null

让我们的本地DB2专家看一下之后,他同意:迄今为止所提出的解决方案(包括这一个)都没有一个完整的表扫描(如果时间戳没有被索引,那么表中的表,或者索引也是如此).它们都扫描表中的每个记录一次.

所有CASE/IF/NVL2()解决方案都为每一行执行空到字符串转换,从而在DBMS上引入了不必要的负载.这个解决方案没有那个问题.



5> ADEpt..:

如果它是oracle那么你可以这样做:

select decode(field,NULL,'NULL','NOT NULL'), count(*)
from table
group by decode(field,NULL,'NULL','NOT NULL');

我确信其他数据库允许类似的技巧.



6> 小智..:

斯图尔特

也许考虑这个解决方案 它(也是!)供应商非特定.

SELECT count([processed_timestamp]) AS notnullrows, 
       count(*) - count([processed_timestamp]) AS nullrows 
FROM table

至于效率,这可以通过在一行中包含结果来避免2x索引搜索/表扫描/任何事情.如果在结果中绝对需要2行,那么由于联合聚合,对该集合的两次传递可能是不可避免的.

希望这可以帮助

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有