mysql:最好的表达方式;以下任何关键字的第一个实例的字符串";?

mysql:最好的表达方式;以下任何关键字的第一个实例的字符串";?,mysql,regex,locate,Mysql,Regex,Locate,我可以在mysql中想出复杂而丑陋的方法来实现这一点,但我正在寻找一种好方法。比如说我有很多学校的名字,比如 Meopham County Infant School Speldhurst Nursery School Rainbow Pre-School The Annex School House Fleet Learning Zone Dartford Grammar School Kiddliwinks Hextable Kindergarten The Rocking Horse Mo

我可以在mysql中想出复杂而丑陋的方法来实现这一点,但我正在寻找一种好方法。比如说我有很多学校的名字,比如

Meopham County Infant School
Speldhurst Nursery School
Rainbow Pre-School
The Annex School House
Fleet Learning Zone
Dartford Grammar School
Kiddliwinks
Hextable Kindergarten
The Rocking Horse Montessori Kinder
Little Angels Day Nursery
我有一个停止词列表:

["school", "primary", "nursery", "college", "junior", "church", "cofe", "community", "infant"]
我有一个ruby函数“short_name”,它返回的学校名称最多为,,但不包括任何停止词的第一个实例,因此我们得到

"Bower Grove School" => "Bower Grove"
"Fulston Manor School" => "Fulston Manor"
"St Johns Church Hall Play" => "St Johns"
"St Botolph's Church of England Voluntary Aided Primary School" => "St Botolph's"
"Fawkham House School" => "Fawkham House"
"Silverdale Day Nursery" => "Silverdale Day"
"Vigo Village School" => "Vigo Village"
"Sevenoaks Primary School" => "Sevenoaks"
"High Weald Academy" => "High Weald Academy"
"The Ebbsfleet Academy" => "The Ebbsfleet Academy"
没关系。我的问题是:在mysql中进行上述字符串处理的最简单方法是什么

例如,如果我想用这个简短的名字搜索,我想做如下的事情

"select * from schools where <function(name)> = 'Bower Grove'"

谢谢,Max

MySQL确实支持正则表达式。不幸的是,它只用于匹配

这里有一种方法:

select least(substring_index(schoolname, ' School', 1),
             substring_index(schoolname, ' Primary', 1),
             . . .
            )
这使用
substring\u index()
提取分隔符前字符串的第一部分。如果分隔符不存在,则得到整个字符串。
least()
函数将选择最短的字符串


这假定该关键字前面有一个空格。毕竟,你可能不想为了“小天使学校”这样的名字而完全删除所有内容。

谢谢@Taemyr,如果可能的话,我宁愿避免使用需要MySQL补丁的解决方案。尽管如此,还是要感谢你的选择:)你有没有考虑过使用LIKE子句<代码>从名为“Bower Grove%”的学校中选择*将返回名称以字符串
Bower Grove
开头的所有学校。我需要在更新和选择中使用该函数,因此我担心这不是一个选项。同时,这也将使被称为“鲍尔格罗夫公园”和“鲍尔格罗夫”的学校得到回报。那太好了,谢谢戈登
substring_index()
是区分大小写的(我假设解决方案是不区分大小写的,因为默认情况下mysql通常是不区分大小写的),但是我从标题化的stopwords(“Primary”、“School”等)开始,为这两个版本生成substring_索引函数,并将它们添加到列表中。
select least(substring_index(schoolname, ' School', 1),
             substring_index(schoolname, ' Primary', 1),
             . . .
            )