我有一个名为personal_websessions
的表,其中包含以下格式的数据:
id_no | website_link
1 | google.com msn.com gmail.com
2 | stackoverflow.com reddit.com
3 | msn.com
您可以使用以下SQL命令创建该表:
CREATE TABLE personal_websessions(id_no INTEGER PRIMARY KEY, website_link TEXT);
INSERT INTO personal_websessions VALUES(1, 'google.com msn.com gmail.com'), (2, 'stackoverflow.com reddit.com'), (3, 'msn.com ');
我想用空格'' 分隔website_link列的值,以获得下表的结果:
id_no | website_link
1 | google.com
1 | msn.com
1 | gmail.com
2 | stackoverflow.com
2 | reddit.com
3 | msn.com
我想通过一个单个空格来分隔website_link列,以实现这一目标-我尝试了各种方法,包括此处概述的方法:
But this example did not help that much as it was for comma separated not space separated
我知道有一种使用sqlite进行此操作的方法,但是我还没有弄清楚!任何帮助是极大的赞赏!
谢谢-Goosfraba
答案 0 :(得分:1)
在SQLite中,递归CTE是最好的方法。我更喜欢这样的版本:
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;
Here是db <>小提琴。
在此特定版本中,所有字符串操作都在CTE的递归部分中。锚点只是设置数据。
如果空格不规则,则使用trim可使查询更加健壮-例如,在文本值之一的末尾有一个空格。
对于lev
,我几乎总是将其包含在递归CTE中,以便在需要时可以看到递归的深度。
所有这些,这不是存储数据的好方法。您应该使用一个单独的表,该表的结构更类似于您要获得的结果集-每个ID和唯一的网站一行。