首页 > 解决方案 > 拆分空格分隔值并将它们映射到 SQLite 中的原始 ID?

问题描述

我有一个名为的表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 列拆分为一个空格来实现这一点 - 我尝试了不同的方法,包括此处概述的方法:

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

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

谢谢-Goosfraba

标签: sqlsqliterecursive-query

解决方案


使用递归CTE

with recursive cte as (
  select id_no, trim(website_link) || ' ' website_link,
    substr(
      website_link, 
      1, 
      case 
        when website_link like '% %' then instr(website_link, ' ') - 1
        else website_link
      end
    ) link
  from personal_websessions
  union all                                                     
  select c.id_no, substr(c.website_link, length(c.link) + 2),
    substr(
      substr(c.website_link, length(c.link) + 2), 
      1, 
      instr(substr(c.website_link, length(c.link) + 2), ' ') - 1
    ) link
  from cte c                                               
  where substr(c.website_link, length(c.link) + 2) like '% %'
)
select id_no, link website_link
from cte
order by id_no

请参阅演示
结果:

| id_no | website_link      |
| ----- | ----------------- |
| 1     | google.com        |
| 1     | msn.com           |
| 1     | gmail.com         |
| 2     | stackoverflow.com |
| 2     | reddit.com        |
| 3     | msn.com           |

推荐阅读