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

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
    执行后返回结果完全匹配预期:
ROLEROLE RIGHTS
AB-ATLREAD
AB-ATLTOTAL
AB-ATLHAPPY
AB-ATLMAD

注意事项

  • 如果你用TOAD连接MySQL、SQL Server等其他数据库,只需要把CONNECT BY层级生成逻辑替换为对应数据库的递归CTE即可,核心的SUBSTRING截取、去等号逻辑完全通用
  • 不需要提前统计每个角色对应的权限个数,SQL会自动根据字符串内的分隔符数量生成对应行数
  • 权限字段存在首尾多余分号时,SQL会自动过滤空值片段,不会生成空白权限记录

内容的提问来源于stack exchange,提问作者S2sooner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:51:42