#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
бы это была одна переменная, а не таблица?