MySQL:instr указать границы слов
-
22-09-2019 - |
Вопрос
я хочу проверить, содержит ли строка значение поля в виде подстроки или нет.
select * from mytable where instr("mystring", column_name);
но это не поиск по границам слов.
select * from mytable where instr("mystring", concat('[[:<:]]',column_name,'[[:>:]]');
тоже не работает.как это исправить?
Решение
Вы можете сделать это, используя REGEXP
оператор:
SELECT * FROM mytable WHERE 'mystring' REGEXP CONCAT('[[:<:]]', column_name, '[[:>:]]');
Однако обратите внимание, что это медленный.Возможно, вам лучше всего использовать MySQL FULLTEXT
функция поиска если тебе важны слова.Или сделай нормальный InStr()
проверьте, а затем отфильтруйте результаты.
Другие советы
Если вам не нужно возвращаемое значение instr
использовать like
вместо
select * from mytable where column_name like '%mystring%';
Как уже обсуждалось в вопросе, который вы спросил вчера, индексы использовать нельзя, и производительность будет плохой, но это может сработать:
select *
from mytable
where 'mystring' = column_name -- exact match
or 'mystring' like concat('% ', column_name) -- word at the end
or 'mystring' like concat(column_name, ' %') -- word at beginning
or 'mystring' like concat('% ', column_name, ' %') -- word in the middle