MySQL находит или удаляет суффикс строки из известного набора

#mysql

#mysql

Вопрос:

Я хочу написать хранимую процедуру MySQL, которая разделит полное доменное имя на части host / authority / tld.

Допустим, у меня есть список известных ДВУ, и для иллюстрации предположим, что это набор

 com
co.uk
uk
 

давайте проверим это на этих строках

 input           | output
----------------|-------
alpha.co.uk     | alpha
mail.beta.uk    | mail.beta
 

Выходные данные — это самая короткая подстрока входных данных, начиная с начала, такая, что CONCAT(output,'.',tld)=input для некоторого tld , который является членом данного набора.

Обратите внимание, что в качестве выходных данных нам нужна самая короткая подстрока, иначе выходные данные были бы alpha.co в первом случае, что неверно.

Я знаю, как написать функцию MySQL, которая сообщает мне, является ли данная строка суффиксом другой строки, но здесь есть много возможных таких строк, и подойдет любая (при условии, что строка больше не является суффиксом ввода).

Я знаю, что мог бы написать регулярное выражение в соответствии со строками co.uk|uk|com , но REGEX оператор MySQL не возвращает позицию совпадения, независимо от того, совпадает оно или нет.

Да, мне действительно нужно решение для этого на языке SQL, а не на языке приложения.

Каков наилучший способ найти или удалить максимально длинный суффикс, учитывая набор допустимых суффиксов?

Ответ №1:

Вот один из способов сделать это, полагаясь на тот факт, что MIN() даст самое короткое из всех совпадений:

 create table tld (tld varchar(100));
create table input (input varchar(100));

insert into tld values ('com'),('co.uk'),('uk');
insert into input values ('alpha.co.uk'),('mail.beta.com');

select 
    input.input as input, 
    min(substring(input.input, 1, length(input.input) - length(tld.tld) - 1)) as output 
from input inner join tld 
on input.input like concat('%.', tld.tld) group by input.input;
 

ИЛИ, если у вас есть только одно значение для input , то:

 set @input = 'alpha.co.uk';

select min(substring(@input, 1, length(@input) - length(tld.tld) - 1)) as output
from tld
where @input like concat('%.', tld.tld);
 

Комментарии:

1. Как бы это выглядело, если input бы это была одна переменная, а не таблица?