Oracle中如何将数值范围拆分为单个数值?
将SN范围表展开为单个SN行
原始数据
| START_SN | END_SN |
|---|---|
| 850000 | 850003 |
| 850015 | 850017 |
期望结果
| SN |
|---|
| 850000 |
| 850001 |
| 850002 |
| 850003 |
| 850015 |
| 850016 |
| 850017 |
解决方案(通用SQL)
使用递归公共表表达式(CTE)可实现范围展开,兼容MySQL 8+、PostgreSQL、SQL Server等主流数据库:
WITH RECURSIVE sn_range AS ( SELECT START_SN AS sn, END_SN FROM your_table_name UNION ALL SELECT sn + 1, END_SN FROM sn_range WHERE sn < END_SN ) SELECT sn AS SN FROM sn_range ORDER BY sn;
执行逻辑
- 初始查询:提取每条范围记录的起始SN和结束SN,作为递归的基础数据。
- 递归迭代:每次将当前SN加1,直到SN等于结束SN时停止迭代。
- 最终输出:取出所有生成的SN并排序,得到单个SN的列表。
兼容低版本MySQL(5.x)
如果使用不支持递归CTE的MySQL 5.x,可预先创建一个包含连续数字的辅助表,再通过JOIN匹配范围:
-- 先创建数字辅助表(示例生成0-1000的数字) CREATE TABLE numbers (num INT); INSERT INTO numbers VALUES (0),(1),(2),...,(1000); -- 展开范围 SELECT t.START_SN + n.num AS SN FROM your_table_name t JOIN numbers n ON n.num <= t.END_SN - t.START_SN ORDER BY SN;
内容的提问来源于stack exchange,提问作者JustPBK
相关产品推荐
相关产品推荐

