MySQL: Instr especifique os limites das palavras
-
22-09-2019 - |
Pergunta
Quero verificar se uma string contém um valor de campo como uma substring ou não.
select * from mytable where instr("mystring", column_name);
Mas isso não procura nos limites das palavras.
select * from mytable where instr("mystring", concat('[[:<:]]',column_name,'[[:>:]]');
também não funciona. Como corrigir isso?
Solução
Você pode fazer isso usando o REGEXP
operador:
SELECT * FROM mytable WHERE 'mystring' REGEXP CONCAT('[[:<:]]', column_name, '[[:>:]]');
Observe, no entanto, que isso é lento. Você pode ser melhor usando os Mysql's FULLTEXT
recurso de pesquisa Se você se importa com palavras. Ou fazer um normal InStr()
Verifique então filtre os resultados.
Outras dicas
Se você não precisar do valor de retorno do instr
usar like
em vez de
select * from mytable where column_name like '%mystring%';
Como já discutido na pergunta você perguntou ontem, nenhum índice pode ser usado e o desempenho será ruim, mas isso pode funcionar:
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