我想编写一个MySQL存储过程,它将FQDN拆分为host / authority / tld部分。
假设我有一个已知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
的方式编写正则表达式,但MySQL REGEX
运算符不会返回匹配的位置,只是它是否匹配。
是的,我确实想要一个SQL解决方案,而不是应用程序语言。
在给定一组有效后缀的情况下,找到或删除最长可能后缀的最佳方法是什么?
答案 0 :(得分:0)
这是一种方法,依靠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);