You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 12:06:45