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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top