Как передать несколько разделителей в substring_index - PullRequest
0 голосов
/ 13 апреля 2019

Я хочу запросить строку между 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-адреса могут содержать несколько разделителей. Я хочу, чтобы в моем заявлении были отражены несколько вариантов делимметров (каждый из которых является отдельным символом):

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

Как это сделать в моем заявлении? Я попытался это решение , но в результате не удалось выполнить команду из-за синтаксической ошибки, хотя я уверен, что следовал решению. Может ли кто-нибудь помочь мне правильно сконструировать запрос, чтобы захватить все перечисленные выше символы разделителя?

Я использую MySQL workbecnh 6.3 в Ubuntu 18.04.

РЕДАКТИРОВАТЬ:

Некоторые исправления, внесенные в первый пример URL.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Во-первых, обратите внимание, что https://www.yahoo.com?en/ кажется маловероятным URL-адресом, поскольку в нем есть разделитель пути, содержащийся в строке запроса.В любом случае, если вы используете MySQL 8+, рассмотрите возможность использования его функции регулярных выражений.Функция 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?://[^/]+';

Демонстрация

Термин $1 относится к первой группе capture в шаблоне регулярных выражений.Явная группа захвата обозначается количеством в скобках.В данном случае вот группа захвата (выделена ниже):

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

То есть группа захвата - это первая часть пути URL, включая домен, поддомен и т. Д.

0 голосов
/ 13 апреля 2019

В 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_.] * * * * * * * * * * * * * * *.

...