我有一个有processed_timestamp
列的表- 如果已经处理了一个记录,那么该字段包含它被处理的日期时间,否则它是null.
我想写一个返回两行的查询:
NULL xx -- count of records with null timestamps NOT NULL yy -- count of records with non-null timestamps
那可能吗?
更新:表格非常大,因此效率非常重要.我可以运行两个查询来分别计算每个总数,但是如果我可以避免它,我想避免两次击中表.
在MySQL中你可以做类似的事情
SELECT IF(ISNULL(processed_timestamp), 'NULL', 'NOT NULL') as myfield, COUNT(*) FROM mytable GROUP BY myfield
在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
甲骨文:
nvl2分组(字段,'NOT NULL','NULL')
尝试以下,它是供应商中立的:
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上引入了不必要的负载.这个解决方案没有那个问题.
如果它是oracle那么你可以这样做:
select decode(field,NULL,'NULL','NOT NULL'), count(*) from table group by decode(field,NULL,'NULL','NOT NULL');
我确信其他数据库允许类似的技巧.
斯图尔特
也许考虑这个解决方案 它(也是!)供应商非特定.
SELECT count([processed_timestamp]) AS notnullrows, count(*) - count([processed_timestamp]) AS nullrows FROM table
至于效率,这可以通过在一行中包含结果来避免2x索引搜索/表扫描/任何事情.如果在结果中绝对需要2行,那么由于联合聚合,对该集合的两次传递可能是不可避免的.
希望这可以帮助