Recursive CTE:
WITH RECURSIVE cte(org, part, rest, pos) AS (
VALUES('C:\Users\fidel\Desktop\Temp', '','C:\Users\fidel\Desktop\Temp'|| '\', 0)
UNION ALL
SELECT org,
SUBSTR(org,1, pos + INSTR(rest, '\')),
SUBSTR(rest, INSTR(rest, '\')+1),
pos + INSTR(rest, '\')
FROM cte
WHERE INSTR(rest, '\') > 0
)
SELECT *
FROM cte
WHERE pos <> 0
ORDER BY pos;
SqlFiddleDemo
Output:
βββββββββββββββββββββββββββββββ
β part β
β ββββββββββββββββββββββββββββββ£
β C:\ β
β C:\Users\ β
β C:\Users\fidel\ β
β C:\Users\fidel\Desktop\ β
β C:\Users\fidel\Desktop\Temp β
βββββββββββββββββββββββββββββββ
How it works:
org - original string does not change
part - simply `LEFT` equivalent of original string taking pos number of chars
rest - simply `RIGHT` equivalent, rest of org string
pos - position of first `\` in the rest
Trace:
ββββββββββββββββββββββββββββββββ¦βββββββββββββββββββββββββββββββ¦βββββββββββββββββββββββββββββ¦ββββββ
β org β part β rest β pos β
β βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββ¬ββββββ£
β C:\Users\fidel\Desktop\Temp β C:\ β Users\fidel\Desktop\Temp\ β 3 β
β C:\Users\fidel\Desktop\Temp β C:\Users\ β fidel\Desktop\Temp\ β 9 β
β C:\Users\fidel\Desktop\Temp β C:\Users\fidel\ β Desktop\Temp\ β 15 β
β C:\Users\fidel\Desktop\Temp β C:\Users\fidel\Desktop\ β Temp\ β 23 β
β C:\Users\fidel\Desktop\Temp β C:\Users\fidel\Desktop\Temp β β 28 β
ββββββββββββββββββββββββββββββββ©βββββββββββββββββββββββββββββββ©βββββββββββββββββββββββββββββ©ββββββ
source
share