24 lines
525 B
Text
24 lines
525 B
Text
|
|
create or replace function run_length_encode(str) as table
|
||
|
|
(WITH RECURSIVE cte AS (
|
||
|
|
SELECT
|
||
|
|
1 AS pos,
|
||
|
|
1 AS counter,
|
||
|
|
SUBSTRING(str, 1, 1) AS char,
|
||
|
|
SUBSTRING(str, 2, 1) AS nextc,
|
||
|
|
UNION ALL
|
||
|
|
SELECT
|
||
|
|
pos + 1 as pos,
|
||
|
|
CASE
|
||
|
|
WHEN nextc = char THEN counter + 1
|
||
|
|
ELSE 1
|
||
|
|
END as counter,
|
||
|
|
nextc as char,
|
||
|
|
SUBSTRING(str, 2 + pos, 1) as nextc
|
||
|
|
FROM cte
|
||
|
|
WHERE pos < LENGTH(str)
|
||
|
|
)
|
||
|
|
SELECT STRING_AGG( counter || char, '' ORDER BY pos) AS encoded_string
|
||
|
|
FROM cte
|
||
|
|
WHERE nextc != char
|
||
|
|
);
|