分割空格分隔的值,并将其映射到SQLite中的原始ID?

时间:2020-01-17 09:38:35

标签: sql sqlite recursive-query

我有一个名为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

1 个答案:

答案 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和唯一的网站一行。