从sqlite3中的URL中提取站点/域名

时间:2018-10-09 20:07:59

标签: sqlite

我正在尝试根据https://superuser.com/questions/602252/can-chrome-browser-history-be-exported-to-an-html-file使用sqlite3浏览我的Chrome历史记录文件。我正在使用“历史记录”数据库的副本。

我希望能够使用sqlite3函数按站点组织URL。我试图弄清楚如何从url列中提取站点(域名)。

一旦我知道了魔术功能,我计划使用此功能,以便可以在site列上编写查询。

ALTER TABLE urls ADD COLUMN site TEXT;
UPDATE urls SET site = ...;

2 个答案:

答案 0 :(得分:0)

到目前为止我有

SELECT 
  SUBSTR(SUBSTR(url, INSTR(url, '//') + 2), 0, INSTR(SUBSTR(url, INSTR(url, '//') + 2), '/')) AS site 
FROM urls;

它似乎可以工作,但是很笨重。有更好的方法吗?

答案 1 :(得分:0)

当某些网址没有http(s)://或结尾/时,这里的公式可以正确处理。

第一个版本使用子选择:

select *, CASE when INSTR(domstage1, '/') > 0 then substr(domstage1, 1, instr(domstage1, '/')-1) else domstage1 end as domain 
from (select *, CASE when INSTR(url, '//') > 0 then substr(url, INSTR(url, '//')+2) else url end as domstage1 from urls);

我发现第二个基于CTE的版本更易于管理和阅读。我还使用了更紧凑的IIF()(在sqlite 3.32中添加),而不是CASE

with
  stage1 as (select url, INSTR(url, '//') as idx_ss from logs where url is not NULL),
  stage2 as (select *, IIF(idx_ss > 0, SUBSTR(url, idx_ss+2), url) as dom1 from stage1),
  stage3 as (select *, INSTR(dom1, '/') as idx_s from stage2),
  stage4 as (select *, IIF(idx_s > 0, SUBSTR(dom1, 1, idx_s-1), dom1) as domain from stage3)
select domain from stage4;

从具有约5000行的小型数据库的计时来看,它们的表现似乎差不多。