Oracle SQL 如何生成两个给定值区间内的字母组合序列
Oracle SQL 字母区间序列生成实现方案
需求说明
现有业务场景需要根据输入的「前缀+起始字母-前缀+结束字母」格式的字符串,生成区间内所有对应组合的序列:
- 输入
V4A-V4G时,输出V4A、V4B、V4C、V4D、V4E、V4F、V4G - 输入
R8M-R8S时,输出R8M、R8N、R8O、R8P、R8Q、R8R、R8S
实现思路
- 拆分输入的区间字符串,得到起始值和结束值
- 提取固定公共前缀、起始后缀字母、结束后缀字母
- 利用Oracle的
CONNECT BY语法生成连续整数序列,对应起始字母到结束字母的ASCII码跨度 - 拼接公共前缀与序列对应字母,得到最终结果
完整实现代码
-- 可直接替换range_str的值测试不同区间 WITH input_params AS ( SELECT 'V4A-V4G' AS range_str FROM DUAL ), -- 拆分起始、结束值 range_split AS ( SELECT SUBSTR(range_str, 1, INSTR(range_str, '-') - 1) AS start_val, SUBSTR(range_str, INSTR(range_str, '-') + 1) AS end_val FROM input_params ), -- 提取公共前缀和首尾字母的ASCII码 parts_extract AS ( SELECT SUBSTR(start_val, 1, LENGTH(start_val) - 1) AS fixed_prefix, ASCII(SUBSTR(start_val, -1)) AS start_ascii, ASCII(SUBSTR(end_val, -1)) AS end_ascii FROM range_split ) -- 生成最终序列 SELECT fixed_prefix || CHR(start_ascii + LEVEL - 1) AS seq_value FROM parts_extract CONNECT BY LEVEL <= end_ascii - start_ascii + 1;
测试验证
将input_params里的range_str改为R8M-R8S,执行后即可得到预期的R8M到R8S的序列输出。
注:当前实现适用于最后一位为单可变字母、前面部分为固定前缀的场景,如果是多字母可变后缀可调整ASCII码计算逻辑适配。
内容的提问来源于stack exchange,提问作者Vinoth_S
相关产品推荐
相关产品推荐

