Oracle实现:无符合条件记录返回指定字符串,否则返回ID
Oracle查询需求解决方案
方法1:返回多行ID,无符合记录时返回提示
用UNION ALL结合判断逻辑就能实现需求:
SELECT ID AS existen FROM dvd.cicle WHERE LENGTH(ID) <> (SELECT MAX(LENGTH(ID)) FROM dvd.cicle) UNION ALL SELECT 'no existen' AS existen FROM dual WHERE NOT EXISTS ( SELECT 1 FROM dvd.cicle WHERE LENGTH(ID) <> (SELECT MAX(LENGTH(ID)) FROM dvd.cicle) );
- 前半部分查询直接拉取所有符合条件的ID;
- 后半部分查询检查是否存在符合条件的记录,若不存在则从
dual表返回'no existen'; - 使用
UNION ALL而非UNION,避免不必要的去重操作,提升查询效率。
方法2:将ID合并为逗号分隔的列表返回
如果需要把所有符合条件的ID拼接成单个字符串返回,可使用LISTAGG函数:
SELECT CASE WHEN cnt = 0 THEN 'no existen' ELSE list_id END AS existen FROM ( SELECT LISTAGG(ID, ', ') WITHIN GROUP (ORDER BY ID) AS list_id, COUNT(ID) AS cnt FROM dvd.cicle WHERE LENGTH(ID) <> (SELECT MAX(LENGTH(ID)) FROM dvd.cicle) ) t;
- 子查询中用
LISTAGG将符合条件的ID拼接成逗号分隔的字符串,同时统计符合条件的记录数量; - 外层通过统计数判断:如果没有符合条件的记录(统计数为0),返回'no existen',否则返回拼接好的ID列表。
原语句的问题分析
你的原语句存在两个核心问题:
- 当没有符合条件的记录时,WHERE子句过滤后不会返回任何行,CASE语句根本没有执行机会,自然无法输出'no existen';
- CASE中的
id IS null判断没有意义,因为WHERE条件已经筛选出ID长度不等于最大长度的记录,这类记录的ID要么是有效值,要么是null(但null的长度为null,不会满足<>的比较条件,所以不会被筛选出来)。
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

