拆分空格分隔值并将它们映射到 SQLite 中的原始 ID?

Bea*_*ast 5 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 
Run Code Online (Sandbox Code Playgroud)

您可以使用以下 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 ');
Run Code Online (Sandbox Code Playgroud)

我想用空格 ' ' 分割 website_link 列的值以获得下表结果:

id_no | website_link 
1     | google.com
1     | msn.com 
1     | gmail.com
2     | stackoverflow.com
2     | reddit.com
3     | msn.com
Run Code Online (Sandbox Code Playgroud)

我想将 website_link 列拆分为一个空格来实现这一点 - 我尝试了不同的方法,包括此处概述的方法:

但是这个例子并没有多大帮助,因为它是逗号分隔而不是空格分隔

我知道有一种方法可以使用 sqlite 做到这一点,但我还没有弄清楚!任何帮助是极大的赞赏!

谢谢 - Goosfraba

Gor*_*off 1

递归 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;
Run Code Online (Sandbox Code Playgroud)

是一个 db<>fiddle。

在此特定版本中,所有字符串操作都在 CTE 的递归部分中。锚点只是设置数据。

如果空格不规则,则使用修剪会使查询更加稳健 - 例如,文本值之一的末尾有一个空格。

至于lev,我几乎总是将其包含在递归 CTE 中,这样如果我愿意的话,我可以看到递归的深度。

话虽如此,这并不是存储数据的好方法。您应该使用一个单独的表,其结构更像您获得的结果集——每个 id 一行和唯一的网站。