Oracle SQL需求:无有效RU时返回提示,否则返回非空行
Oracle 查询:区分全为NULL的分组并返回提示信息
我来帮你搞定这个查询需求,核心思路是先判断每个cu分组下的ru是否全为NULL,再分两种情况返回对应结果:
解决方案SQL
WITH cu_ru_status AS ( SELECT cu, ru, -- 统计当前cu分组下非NULL的ru数量,0表示该cu的ru全为NULL COUNT(ru) OVER (PARTITION BY cu) AS non_null_ru_count FROM cu_ru ) -- 情况1:有非NULL ru的cu,仅返回ru不为NULL的行 SELECT cu, ru FROM cu_ru_status WHERE non_null_ru_count > 0 AND ru IS NOT NULL UNION ALL -- 情况2:ru全为NULL的cu,返回一条提示行 SELECT DISTINCT cu, 'no ru unit.' AS ru FROM cu_ru_status WHERE non_null_ru_count = 0 ORDER BY cu;
测试数据准备
先插入符合你预期的测试数据(补全了缺失的部分):
CREATE TABLE cu_ru ( cu VARCHAR2(30), ru VARCHAR2(30) ); -- cu-1:所有ru非NULL,返回全部行 INSERT INTO cu_ru (cu, ru) VALUES ('cu-1', 'ru-1-1'); INSERT INTO cu_ru (cu, ru) VALUES ('cu-1', 'ru-1-2'); INSERT INTO cu_ru (cu, ru) VALUES ('cu-1', 'ru-1-3'); -- cu-2:所有ru为NULL,返回提示行 INSERT INTO cu_ru (cu, ru) VALUES ('cu-2', NULL); INSERT INTO cu_ru (cu, ru) VALUES ('cu-2', NULL); -- cu-3:存在非NULL ru,返回非NULL的3行(附带的NULL行自动过滤) INSERT INTO cu_ru (cu, ru) VALUES ('cu-3', 'ru-3-1'); INSERT INTO cu_ru (cu, ru) VALUES ('cu-3', 'ru-3-2'); INSERT INTO cu_ru (cu, ru) VALUES ('cu-3', 'ru-3-3'); INSERT INTO cu_ru (cu, ru) VALUES ('cu-3', NULL);
逻辑解释
- CTE
cu_ru_status:用窗口函数COUNT(ru) OVER (PARTITION BY cu)统计每个cu分组下非NULL的ru数量——因为COUNT(ru)会自动忽略NULL值,所以结果为0时说明该cu的所有ru都是NULL。 - 第一个SELECT:筛选出有非NULL ru的分组,只保留
ru IS NOT NULL的行; - 第二个SELECT:筛选出全为NULL的分组,用
DISTINCT确保每个这样的cu只返回一条提示行; - UNION ALL:把两种结果合并,最后按
cu排序让结果更规整。
执行后就能得到你预期的结果:
- cu-1的3条完整行
- cu-2的1条提示行(
cu-2 | no ru unit.) - cu-3的3条非NULL行
内容的提问来源于stack exchange,提问作者fallingdog
相关产品推荐
相关产品推荐

