首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PostgreSQL从url中提取域

问使用PostgreSQL从url中提取域
EN

Stack Overflow用户
提问于 2019-05-07 09:41:25
回答 3查看 2.7K关注 0票数 1

我需要提取使用PostgreSQL的urls列表的域名。在第一个版本中,我尝试使用REGEXP_REPLACE替换不想要的字符,比如www.、biz.、体育等等,以获得域名。

代码语言:javascript
复制
 SELECT REGEXP_REPLACE(url, ^((www|www2|www3|static1|biz|health|travel|property|edu|world|newmedia|digital|ent|staging|cpelection|dev|m-staging|m|maa|cdnnews|testing|cdnpuc|shipping|sports|life|static01|cdn|dev1|ad|backends|avm|displayvideo|tand|static03|subscriptionv3|mdev|beta)\.)?', '') AS "Domain", 
 COUNT(DISTINCT(user)) AS "Unique Users"
 FROM db
 GROUP BY 1
 ORDER BY 2 DESC;

这似乎是不利的,因为查询需要不断更新,以列出不想要的单词。

我确实尝试过https://stackoverflow.com/a/21174423/10174021使用PostgreSQL REGEXP_SUBSTR从行的末尾提取,但是,作为回报,我得到了空白行。还有更好的方法吗?

要尝试的数据集示例:

代码语言:javascript
复制
 CREATE TABLE sample (
 url VARCHAR(100) NOT NULL);

 INSERT INTO sample url) 
 VALUES 
 ("sample.co.uk"),
 ("www.sample.co.uk"),
 ("www3.sample.co.uk"),
 ("biz.sample.co.uk"),
 ("digital.testing.sam.co"),
 ("sam.co"),
 ("m.sam.co");

期望输出

代码语言:javascript
复制
+------------------------+--------------+
|    url                 |  domain      |
+------------------------+--------------+
| sample.co.uk           | sample.co.uk |
| www.sample.co.uk       | sample.co.uk |
| www3.sample.co.uk      | sample.co.uk |
| biz.sample.co.uk       | sample.co.uk |
| digital.testing.sam.co | sam.co       |
| sam.co                 | sam.co       |
| m.sam.co               | sam.co       |
+------------------------+--------------+
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-14 02:57:50

所以,我用Jeremy和Rémy Baron的答案找到了解决方案。

  1. 从公共后缀中提取所有公共后缀,并将其存储到一个表中,我将其标记为tlds。
  2. 获取数据集中的唯一urls并与其TLD匹配。

​

  1. 使用regexp_replace (在此查询中使用)或替代regexp_substr(t1.url, '([a-z]+)(.)'||t1."tld")提取域名。最后产出:

​

SQL查询如下:

代码语言:javascript
复制
WITH stored_tld AS(
SELECT 
DISTINCT(s.url),
FIRST_VALUE(t.domain) over (PARTITION BY s.url ORDER BY length(t.domain) DESC
                            rows between unbounded preceding and unbounded following) AS "tld" 
FROM sample s 
JOIN tlds t 
ON (s.url like '%%'||domain))

SELECT 
t1.url,
CASE WHEN t1."tld" IS NULL THEN t1.url ELSE regexp_replace(t1.url,'(.*\.)((.[a-z]*).*'||replace(t1."tld",'.','\.')||')','\2') 
END AS "extracted_domain" 
FROM(
    SELECT a.url,st."tld"
    FROM sample a
    LEFT JOIN stored_tld st
    ON a.url = st.url
    )t1

尝试链接:SQL测试器

票数 2
EN

Stack Overflow用户

发布于 2019-05-07 10:32:01

你可以试试这个:

代码语言:javascript
复制
with tlds as (
     select * from (values('.co.uk'),('.co'),('.uk')) a(tld)
) ,
sample as (
    select * from (values ('sample.co.uk'),
                          ('www.sample.co.uk'),
                          ('www3.sample.co.uk'),
                          ('biz.sample.co.uk'),
                          ('digital.testing.sam.co'),
                          ('sam.co'),
                          ('m.sam.co')
                   ) a(url)
     ) 
  select url,regexp_replace(url,'(.*\.)(.*'||replace(tld,'.','\.')||')','\2') "domain" from (
            select distinct url,first_value(tld) over (PARTITION BY url order by length(tld) DESC) tld 
               from sample join tlds on (url like '%'||tld) 
         ) a
票数 1
EN

Stack Overflow用户

发布于 2022-02-27 14:15:29

为此,我使用了split_part(url,'/',3):

代码语言:javascript
复制
select split_part('https://stackoverflow.com/questions/56019744', '/', 3) ;

输出

代码语言:javascript
复制
stackoverflow.com
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56019744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档