我想说您的要求非常奇怪,因为您几乎可以肯定只需使用NVL()
,COALESCE()
或即可获得更有效的查询CASE
。但是,我设法仅使用子查询来获得正确的结果(并处理NULL
值的存在或不存在)。如果没有在子句中使用子查询,我还没有设法做到这一点FROM
。
SQL小提琴
查询 1:
SELECT nnh.not_null_hours + nh.null_hours
FROM (
SELECT COUNT(DISTINCT t.hour) not_null_hours
FROM example_table t
) nnh
CROSS JOIN (
SELECT 1 null_hours
FROM dual
WHERE EXISTS (
SELECT 1
FROM example_table t
WHERE t.hour IS NULL
)
UNION ALL
SELECT 0 null_hours
FROM dual
WHERE NOT EXISTS (
SELECT 1
FROM example_table t
WHERE t.hour IS NULL
)
) nh
结果:
| NNH.NOT_NULL_HOURS+NH.NULL_HOURS |
------------------------------------
| 3 |
这将花费大量精力来应对要求。一个更简单的选择是使用NVL
,然后是两个简单的选择之一......要么:
- 用于
TO_CHAR
将非 NULL 值转换为数据类型 VARCHAR2并将值NVL
转换NULL
为 VARCHAR2'NULL'
或
- 只需使用
NVL
一个您知道将永远不会出现在结果集中的幻数(即由于表上的约束)。
查询 1:
SELECT
COUNT(DISTINCT NVL(TO_CHAR(hour), 'NULL')) using_to_char_null
, COUNT(DISTINCT NVL(hour, -1)) using_magic_number
FROM example_table
结果:
| USING_TO_CHAR_NULL | USING_MAGIC_NUMBER |
-------------------------------------------
| 3 | 3 |