Рекурсивный CTE - лучший подход в SQLite. Я предпочитаю версию, подобную этой:
with cte(id_no, website_link, rest, lev) as (
select pw.id_no, NULL as website_link, trim(pw.website_link) || ' ' as rest, 1 as lev
from personal_websessions pw
union all
select cte.id_no,
trim(substr(cte.rest, 1, instr(cte.rest, ' '))),
substr(cte.rest, instr(cte.rest, ' ') + 1),
lev + 1
from cte
where rest <> ''
)
select id_no, website_link
from cte
where website_link <> ''
order by id_no;
Здесь - это db <> скрипка.
В этой конкретной версии все манипуляции со строками находятся в рекурсивной части CTE. Якорь просто устанавливает данные.
Использование обрезки делает запрос более устойчивым, если пробелы нерегулярны - например, у вас есть пробел в конце одного из текстовых значений.
Что касается lev
, я почти всегда включаю это в рекурсивные CTE, чтобы я мог видеть глубину рекурсии, если я хочу.
Все это говорит о том, что это не очень хороший способ хранения данных. Вы должны использовать отдельную таблицу, структура которой больше похожа на набор результатов, который вы получаете - одна строка на идентификатор и уникальный веб-сайт.