mysql: instr определяет границы слова

Я хочу проверить, содержит ли строка значение поля в качестве подстроки или нет.

select * from mytable where instr("mystring", column_name);

но это не поиск по границам слов.

select * from mytable where instr("mystring", concat('[[:<:]]',column_name,'[[:>:]]');

тоже не работает. как это исправить?

3 ответа

Решение

Вы можете сделать это с помощью REGEXPоператор:

SELECT * FROM mytable WHERE 'mystring' REGEXP CONCAT('[[:<:]]', column_name, '[[:>:]]');

Обратите внимание, однако, что этомедленно. Вы могли бы быть лучше, используя MySQLFULLTEXT Функция поиска, если вы заботитесь о словах. Или сделать нормальный 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
Другие вопросы по тегам