Split a string into rows using pure SQLite

前端 未结 4 1427
深忆病人
深忆病人 2020-12-16 06:08

Using SQLite, I\'d like to split a string in the following way.

Input string:

C:\\Users\\fidel\\Desktop\\Temp

and have

4条回答
  •  执念已碎
    2020-12-16 06:13

    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 ║
    ╚══════════════════════════════╩══════════════════════════════╩════════════════════════════╩═════╝
    

提交回复
热议问题