如何在substring_index

时间:2019-04-13 13:45:52

标签: mysql sql database substring relational-database

我想查询https://或http://与它后面的第一个分隔符之间的字符串。例如,如果该字段包含:

https://google.com/en/
https://www.yahoo.com?en/

我想得到:

google.com
www.yahoo.com

我将捕获/的初始查询仅包含两个substring_index,如下所示:

SELECT substring_index(substring_index(mycol,'/',3),'://',-1)
FROM mytable;

现在,我发现URL可能包含多个分隔符。我想让自己的角色捕捉到多个可能的分界符(每个分界符是一个单独的角色):

:/?#[]@!$&'()*+,;=

如何在我的陈述中这样做?我尝试了this solution,但是最终结果由于语法错误而无法执行命令,但是我确定我遵循了解决方案。谁能帮助我正确地构建查询以捕获上面列出的所有分隔符?

我在Ubuntu 18.04上使用MySQL workbecnh 6.3。

编辑:

在第一个URL示例中进行了一些更正。

2 个答案:

答案 0 :(得分:0)

在MySQL 8+中,这应该起作用:

SELECT regexp_replace(regexp_substr(mycol, '://[a-zA-Z0-9_.]+[/:?]'), '[^a-zA-Z0-9_.]', '')
FROM (SELECT 'https://google.com/en' as mycol union all
      SELECT 'https://www.yahoo.com?en'
     ) x

在旧版本中,这更具挑战性,因为无法搜索字符串类。

一种蛮力方法是:

select (case when substring_index(mycol, '://', -1) like '%/%'
             then substring_index(substring_index(mycol, '://', -1), '/', 1)
             when substring_index(mycol, '://', -1) like '%?%'
             then substring_index(substring_index(mycol, '://', -1), '?', 1)
             . . .   -- and so on for each character
             else substring_index(mycol, '://', -1) 
        end) as what_you_want

[a-zA-Z0-9_.]的目的类似于您的域名的有效字符类。

答案 1 :(得分:0)

首先,请注意https://www.yahoo.com?en/似乎是不太可能的URL,因为它在查询字符串中包含路径分隔符。无论如何,如果您使用的是MySQL 8+,请考虑使用其regex功能。 REGEXP_REPLACE函数在这里可以使用以下模式提供帮助:

https?://([A-Za-z_0-9.-]+).*

示例查询:

WITH yourTable AS (
    SELECT 'https://www.yahoo.com?en/' AS url UNION ALL
    SELECT 'no match'
)

SELECT
    REGEXP_REPLACE(url, 'https?://([A-Za-z_0-9.-]+).*', '$1') AS url
FROM yourTable
WHERE url REGEXP 'https?://[^/]+';

Demo

术语$1指的是正则表达式模式中的第一个 capture 组。显式捕获组由括号中的数量表示。在这种情况下,这是捕获组(在下面突出显示):

https?://([A-Za-z_0-9.-]+).*
          ^^^^^^^^^^^^^^^

也就是说,捕获组是URL路径的第一部分,包括域,子域等。