如何在SQL中显示min_value与max_value之间的所有奇数?
查询两个数值之间所有奇数的SQL实现
要获取min_value和max_value之间的所有奇数,核心思路是精准生成或筛选符合条件的奇数,下面提供几种不同场景下的实现方案:
高效递归生成方案(推荐,支持递归CTE的数据库:MySQL 8.0+、PostgreSQL、SQL Server等)
直接从第一个符合条件的奇数开始,每次递增2生成后续奇数,避免遍历所有数值:
WITH RECURSIVE odd_nums AS ( SELECT CASE WHEN min_value % 2 = 1 THEN min_value ELSE min_value + 1 END AS odd_num WHERE min_value <= max_value UNION ALL SELECT odd_num + 2 FROM odd_nums WHERE odd_num + 2 <= max_value ) SELECT odd_num AS odd_number FROM odd_nums ORDER BY odd_num;
逻辑说明
- 先判断
min_value是否为奇数:是则直接作为起始值,否则取min_value + 1作为第一个奇数 - 每次递归将当前奇数加2,确保生成的始终是奇数
- 当生成的数超过
max_value时停止递归
遍历筛选方案(适合不支持递归CTE的旧版本数据库)
先生成min_value到max_value之间的所有数值,再筛选出奇数:
以MySQL为例,用UNION ALL生成连续数值(范围小的场景适用):
SELECT num AS odd_number FROM ( SELECT min_value + n AS num FROM ( SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) t WHERE min_value + n <= max_value -- 若范围较大,可继续扩展UNION ALL的数值,或用其他方式生成连续数 ) numbers WHERE num % 2 = 1 ORDER BY num;
不同数据库的语法细节
- SQL Server:递归查询需添加
OPTION (MAXRECURSION 0)(当范围超过100时),避免递归次数限制 - PostgreSQL:判断奇数也可使用
MOD(num, 2) = 1,效果与num % 2 = 1一致 - Oracle:可使用
CONNECT BY实现:
SELECT min_value + LEVEL - 1 AS odd_number FROM dual WHERE (min_value + LEVEL - 1) % 2 = 1 CONNECT BY min_value + LEVEL - 1 <= max_value ORDER BY odd_number;
内容的提问来源于stack exchange,提问作者AAB
相关产品推荐
相关产品推荐

