【问题标题】:Explode/Split one row into multiple rows based on column value根据列值将一行分解/拆分为多行
【发布时间】:2021-07-26 13:33:13
【问题描述】:

我有一张需要分解和拆分的表 - 根据 MariaDB 中的 app_permissions 列值从一行生成多行:

[email]        | [app_permissions]
john@p.ai      | {draft49:CAN_ACCESS_APP;CAN_VIEW_FINANCIAL_DATA}; {com.cc.worker:CAN_ACCESS_APP;CAN_VIEW_FINANCIAL_DATA} 

这是预期的查询结果:

[email]        | [app_permissions]
john@p.ai      | draft49:CAN_ACCESS_APP
john@p.ai      | draft49:CAN_VIEW_FINANCIAL_DATA
john@p.ai      | com.cc.worker:CAN_ACCESS_APP
john@p.ai      | com.cc.CAN_VIEW_FINANCIAL_DATA

我试图交叉连接到同一个表,但它没有产生这个输出

此外,据我所知,MariaDB 没有原生的“split_part”功能,并且我正在努力避免为此目的创建过程。

数据库:MariaDB 10.2

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    这很痛苦,但是你可以构造一个数字列表,然后使用substring_index()提取分号之间的第n个子字符串。

    然后您需要从字符串中删除您似乎不想要的其他字符:

    select t.email,
           replace(replace(replace(substring_index(substring_index(t.app_permissions, ';', n.n), ';', -1), '}', ''), '{', ''), ' ', '') as permission
    from t join
         (select 1 as n union all select 2 as n union all select 3 as n union all select 4 as n union all select 5) n
         on t.app_permissions like concat('%', repeat(';%', n - 1));
    

    我建议您修复您的数据模型,这样您就不会在单个字符串中存储多个值。

    Here 是一个 dbfiddle。

    【讨论】:

    • 我同意这个数据模型并不理想。很好的答案!它回答了我需要的 80%,因为它仅限于 5 个权限,我需要更通用的东西
    • @Arik 。 . .只需将定义 n 的子查询扩展为您需要的任意数量。
    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 2023-04-01
    • 2020-02-10
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多