Если вы хотите вывести все строки для определенных ролей, но только одну строку для других, вы можете сделать следующее:
WITH your_table AS (SELECT 'a123456' user_id, 'abcd:READ_ONLY' full_role FROM dual UNION ALL
SELECT 'a123456' user_id, 'fghi:READ_ONLY' full_role FROM dual UNION ALL
SELECT 'a123456' user_id, 'zyxw:WRITE' full_role FROM dual UNION ALL
SELECT 'a123456' user_id, 'vuts:WRITE' full_role FROM dual)
SELECT user_id,
role
FROM (SELECT DISTINCT user_id,
SUBSTR(full_role, INSTR(full_role, ':') + 1) AS role,
CASE
WHEN SUBSTR(full_role, INSTR(full_role, ':') + 1) = 'READ_ONLY' THEN
rownum
ELSE
NULL
END rn
FROM your_table)
ORDER BY user_id, ROLE;
USER_ID ROLE
------- --------------
a123456 READ_ONLY
a123456 READ_ONLY
a123456 WRITE
Это кажется немного странным;Мне было бы интересно узнать больше о том, зачем вам это нужно.