Регулярные выражение в SQL запросах

Подскажите пожалуйста как сделать. Делаю поиск по базе. Смысл такой: нужно что бы для маленьких слов поиск было только по слову, а не по вхождению. К примеру: слово "it". Нужно что бы в строках "IT индустрия" "Курсы IT" "IT-Специалист" находилось, а в строках: "deportamit" "position" "sitel" нет

На данный момент просто добавляю пробелы

SELECT * FROM `links` WHERE description LIKE '% it %'

Но тогда не находятся записи где IT это начало строки или где стоит тире после слова. Попробовал RegExp, но почему то не получается

SELECT * FROM `links` WHERE description REGEXP '(^|\s)it[^\w]'

Подскажите пожалуйста как мне сделать такой поиск или что не так в регулярке.


Ответы (2 шт):

Автор решения: Qwertiy

Стандартный подход -перечислять все 3 варианта явно:

WHERE description LIKE 'it %' OR description LIKE '% it' OR description LIKE '% it %'

Но в любом случае тут будет косяк когда после него (ну или перед) будет стоять не пробел, а точка, запятая или ещё какой-то знак.

Думаю, лучше подключить специальные инструменты для полнотекстового поиска (например, Elastic Search) и пользоваться ими.

→ Ссылка
Автор решения: Wiktor Stribiżew

Используйте границы слов.

В MySQL 8 и новее можно использовать

SELECT * FROM `links` WHERE description REGEXP '\\bit\\b'

В старых версиях MySQL можно использовать

SELECT * FROM `links` WHERE description REGEXP '[[:<:]]it[[:>:]]'

\b, граница слова, в начале it найдёт совпадение лишь в том случае, если сразу перед it имеется начало строки или символ, отличный от буквы, цифры или символа нижнего подчёркивания. \b после it найдёт совпадение, если сразу после it имеется конец строки или символ, отличный от буквы, цифры или символа нижнего подчёркивания.

В старых версиях MySQL [[:<:]] обозначает начальную (левую) границу слова, а [[:>:]] — конечную (правую).

→ Ссылка