TOAD SQL如何拆分分号分隔单元格值为多行并保留对应ROLE值
TOAD环境下ROLE_RIGHTS字段拆行SQL方案
完全可以通过SUBSTRING类函数实现,不需要依赖自定义函数或第三方插件,适配TOAD最常连接的Oracle数据库环境,写法兼容TOAD全版本,运行后直接返回你要的拆行结果。
核心实现逻辑
- 给原始权限字符串末尾补充分号,统一分隔符定位规则,解决最后一个权限值后无分号的边界问题
- 通过Oracle原生层级查询生成对应拆分行数,有多少个权限就生成多少条记录
- 用
SUBSTR(Oracle环境下SUBSTR为SUBSTRING的标准兼容实现)截取相邻分号间的权限片段,用LTRIM去掉片段开头的等号 - 每行自动保留对应ROLE字段的原始值,不需要额外关联
可直接运行的SQL代码
把CTE里的表/查询替换成你自己的原始取数逻辑即可直接执行:
WITH source_data AS ( -- 下方替换为你当前查询ROLE、ROLE RIGHTS字段的实际SQL SELECT ROLE, "ROLE RIGHTS", "ROLE RIGHTS" || ';' AS rights_str FROM your_role_table ) SELECT ROLE, LTRIM( SUBSTR( rights_str, INSTR(rights_str, ';', 1, LEVEL - 1) + 1, INSTR(rights_str, ';', 1, LEVEL) - INSTR(rights_str, ';', 1, LEVEL - 1) - 1 ), '=' ) AS "ROLE RIGHTS" FROM source_data CONNECT BY LEVEL <= LENGTH(rights_str) - LENGTH(REPLACE(rights_str, '=', '')) AND PRIOR ROLE = ROLE AND PRIOR SYS_GUID() IS NOT NULL;
样例验证效果
针对你给出的测试数据:
- 原始ROLE值:
AB-ATL - 原始ROLE RIGHTS值:
=READ;=TOTAL;=HAPPY;=MAD
执行后返回结果完全匹配预期:
| ROLE | ROLE RIGHTS |
|---|---|
| AB-ATL | READ |
| AB-ATL | TOTAL |
| AB-ATL | HAPPY |
| AB-ATL | MAD |
注意事项
- 如果你用TOAD连接MySQL、SQL Server等其他数据库,只需要把
CONNECT BY层级生成逻辑替换为对应数据库的递归CTE即可,核心的SUBSTRING截取、去等号逻辑完全通用 - 不需要提前统计每个角色对应的权限个数,SQL会自动根据字符串内的分隔符数量生成对应行数
- 权限字段存在首尾多余分号时,SQL会自动过滤空值片段,不会生成空白权限记录
内容的提问来源于stack exchange,提问作者S2sooner
相关产品推荐
相关产品推荐

