2015-02-23 5 views
1

Я могу думать о запутанных и уродливых способах сделать это в mysql, но я ищу хороший способ. Скажем, у меня есть куча названий школ, как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"] 

У меня есть функция рубиновой «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?

например, если я хотел искать этого SHORT_NAME, я хотел бы сделать что-то вроде

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

, что это самый простой способ сделать <function>? Я думал, что некоторая комбинация substring() и locate() с использованием регулярного выражения будет способом, но похоже, что я не могу использовать регулярное выражение с локацией.

Я предполагаю, что регулярное выражение будет

"school|primary|nursery|college|junior|church|cofe|community|infant" 

спасибо, Макс

+0

http://stackoverflow.com/questions/5361457/mysql-return-matching-pattern-in-regexp-query – Taemyr

+0

Спасибо @Taemyr, я бы предпочел избежать решения, требующего исправления для MySQL, если это возможно. Оцените вариант, хотя :) –

+0

Вы вообще не рассматривали использование предложения LIKE? 'SELECT * FROM school WHERE name LIKE 'Bower Grove%';' будет возвращать все школы, где имя начинается с строки 'Bower Grove'. –

ответ

2

MySQL не поддерживает регулярные выражения. К сожалению, он используется только для сопоставления.

Вот один из методов:

select least(substring_index(schoolname, ' School', 1), 
      substring_index(schoolname, ' Primary', 1), 
      . . . 
      ) 

Это использует substring_index(), чтобы извлечь первую часть строки перед сепаратором. Если разделитель отсутствует, вы получаете всю строку. Затем функция least() выберет кратчайшую строку.

Предполагается, что это ключевое слово имеет перед ним пробел. В конце концов, вы, вероятно, не хотите полностью ликвидировать все для такого имени, как «Школа для маленьких ангелов».

+0

Это здорово, спасибо Гордон. 'substring_index()' чувствителен к регистру (я предположил, что решение будет нечувствительным к регистру, поскольку по умолчанию mysql обычно является), но я обошел это, начиная с заглавных слов («Первичный», «Школа» и т. д.) и генерируя функции substring_index для обеих версий и добавления их в список. –