WITH t(v) AS ( SELECT 'image,search,photo,image,photo' FROM dual ) SELECT LISTAGG(v, ',') WITHIN GROUP(ORDER BY lv, rn) v FROM ( SELECT v , lv , ROW_NUMBER() OVER(PARTITION BY v ORDER BY lv) rn FROM ( SELECT REGEXP_SUBSTR(t.v, '[^,]+', 1, LEVEL) v, LEVEL lv FROM t CONNECT BY LEVEL <= REGEXP_COUNT(t.v, ',') + 1 ) ) WHERE rn = 1
MySQL
WITH a (id, col) AS ( SELECT 1, 'image,search,photo,image,photo' UNION ALL SELECT 2, 'a,a,b,c,c' ), t (seq) AS ( SELECT 0 AS seq UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) SELECT a.id, GROUP_CONCAT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(a.col, ',', t.seq + 1), ',', -1)) FROM a INNER JOIN t ON t.seq <= LENGTH(a.col) - LENGTH(REPLACE(a.col, ',', '')) GROUP BY a.id;
MS-SQL 2017
WITH a (id, col) AS ( SELECT 1, 'image,search,photo,image,photo' UNION ALL SELECT 2, 'a,a,b,c,c' ), b (id, col) AS ( SELECT a.id, t.value FROM a CROSS APPLY STRING_SPLIT(a.col, ',') t GROUP BY a.id, t.value ) SELECT id, STRING_AGG(col, ',') FROM b GROUP BY id;