Oracle SQL 选择,比较 2 个 listagg 的值

时间:2020-12-28 08:50:52

标签: sql oracle

我有两张表:一张是TEXT_MSG,列ROLES,另一张是USERS,列ROLES .列 ROLESlistagg VARCHAR2,分隔符是 : 符号。可以使用 WHERE 子句编写 SQL 语句以从 USERS 表中获取记录 WHERE 来自 TEXT_MSG.ROLES 的一个或多个角色等于来自 USERS.ROLES 的角色?例如:

<块引用>

TEXT_MSG.ROLES 为 1:5:7:10;
USERS.ROLES 为 1:3。

不使用PL/SQL?

1 个答案:

答案 0 :(得分:1)

您可以根据U.ROLES生成记录,如下一一比较:

SELECT distinct U.USERID, U.ROLES, T.ROLES FROM USERS U 
CROSS JOIN table( 
        cast(multiset( 
            select level from dual 
            connect by level <= regexp_count(U.ROLES, ':') + 1) 
        as sys.odcinumberlist) ) lvls
JOIN TEXT_MSG T ON ':' || T.ROLES || ':' LIKE 
                   '%:' || REGEXP_SUBSTR(U.ROLES,'[^:]+',1,lvls.column_value) || ':%'