【问题标题】:Postgres - how to split and join?Postgres - 如何拆分和加入?
【发布时间】:2013-07-27 01:15:36
【问题描述】:

有没有办法将一列拆分为标记,并将它们连接起来(就像在其他编程语言中一样,例如 Python、Java、Ruby)

我有一个包含诸如“http://www.Yahoo.com”之类的 url 的列,我想从中提取“Yahoo.com”(主域,而不是子域)。网址可以是以下形式:

我计划在 http:// 之后和下一个斜杠之前使用正则表达式来提取所有内容。然后用句点 (.) 分割 url,然后加入最后 2 个标记。

使用正则表达式,我可以从http://www.yahoo.com 中提取 www.yahoo.com。通过拆分/连接,我可以从 www.yahoo.com 获取 yahoo.com。问题是我不知道如何使用 Postgres 进行拆分/连接。

有人知道方法吗?还是更好的选择?

【问题讨论】:

    标签: regex postgresql


    【解决方案1】:

    这不是您要求的方法,但应该得到您想要的:

    vinod=# select * from table;
                url                
    ----------------------------------
     http://www.domain.com
     http://domain.com
     http://domain.com/page/page1
     http://www.domain.com/page/page2
     http://www.domain.com/
    (5 rows)
    
    vinod=# select substring(substring(url from 'http[s]*://([^/]+)') from '\w+\.\w+$') from table;
     substring  
    ------------
     domain.com
     domain.com
     domain.com
     domain.com
     domain.com
    (5 rows)
    

    内部substring 命令提取整个域,外部substring 命令提取最后两个片段。 Postgresql 的拆分和连接命令不如普通脚本语言强大,所以如果可以的话,我倾向于在从数据库中提取内容后执行此类操作。

    【讨论】:

      【解决方案2】:

      您可以将它们与\w+.[^.]+$匹配

      http://www.domain.com -> domain.com
      http://domain.com -> domain.com
      http://domain.com/page/page1 -> domain.com/page/page1
      http://www.domain.com/ -> domain.com/
      http://www.domain.com/page/page2 -> domain.com/page/page2
      

      【讨论】:

      • 那么像select substring(subtstring(url from '(\w+[.])?\w+[.]\w+') from '\w+[.]\w+$') from table这样的东西呢
      【解决方案3】:

      将事物拆分为令牌可以通过多种方式完成:

      • regexp_split_to_table / regexp_split_to_array
      • string_to_array(用于简单的固定分隔符拆分)
      • 手动substring提取或substring(... from 'pattern')
      • 全文搜索的to_tsvectorto_tsquery
      • 过程语言库,例如 Perl 或 Python URL 库、用于自然语言处理的 Python + NLTK 等

      在这种情况下,您可以使用 regexp_split_.... 使用正则表达式进行 URL 拆分,这对于许多用途来说可能没问题 - 但可能不是这个。考虑:

      • 我的域,ringerc.id.au“主”域)
      • www.ecu.edu.au(“主”域是ecu.edu.au
      • www.transperth.wa.gov.au(“主”域是transperth.wa.gov.au
      • tartarus.uwa.edu.au(“主”域是uwa.edu.au

      祝您好运,使用正则表达式处理所有国家注册机构和子注册机构的变体。使用适当的 URL 解析器来提取域,然后使用适当的域感知库来确定“主”域对于您的目的是什么。我建议首先使用 plperl 和 the URL::SplitURI 模块。或者您想要的任何受支持的过程语言(Python、TCL 等)的 URL 解析器。然后为该语言找到一个合适的库,该库可以根据您想要的标准有意义地识别域和子域并使用它,而不仅仅是依赖于正则表达式。

      加入时你同样有很多选择:

      • array_to_string
      • string_agg
      • || 连接运算符
      • 过程语言字符串操作和库

      对于 URL 工作,我再次建议使用具有适当本机 URL 库的 PL 来执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 2012-10-03
        • 2011-05-31
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 2019-04-06
        相关资源
        最近更新 更多