MySQL在已知集合中找到或删除字符串后缀

时间:2016-10-14 18:01:26

标签: mysql

我想编写一个MySQL存储过程,它将FQDN拆分为host / authority / tld部分。

假设我有一个已知TLD列表,为了便于说明,我们说它是集合

com
co.uk
uk

让我们针对这些字符串进行测试

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

输出是输入的最短子串,从头开始,对于作为给定集合成员的某些CONCAT(output,'.',tld)=inputtld

请注意,我们需要最短的子字符串作为输出,否则在第一种情况下输出将是alpha.co,这是错误的。

我知道如何编写一个MySQL函数,它告诉我一个给定的字符串是否是另一个字符串的后缀,但是这里有很多可能的字符串,任何都可以(如果不再是字符串也是输入的后缀)

我知道我可以按co\.uk|uk|com的方式编写正则表达式,但MySQL REGEX运算符不会返回匹配的位置,只是它是否匹配。

是的,我确实想要一个SQL解决方案,而不是应用程序语言。

在给定一组有效后缀的情况下,找到或删除最长可能后缀的最佳方法是什么?

1 个答案:

答案 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);