Frage

Ich möchte überprüfen, ob ein String einen Feldwert als Teil enthält oder nicht.

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

aber sucht nicht auf Wortgrenzen.

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

funktioniert auch nicht. wie dies zu korrigieren?

War es hilfreich?

Lösung

Sie können dies tun, um die Verwendung von REGEXP Betreiber:

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

Beachten Sie jedoch, dass dies langsam . Sie könnten am besten aus seinem mit dem FULLTEXT Suchfunktion MySQL , wenn Sie Wörter kümmern. Oder hat eine normale InStr() dann überprüft, um die Ergebnisse zu filtern.

Andere Tipps

Wenn Sie nicht brauchen, um den Rückgabewert der instr Verwendung like statt

select * from mytable where column_name like '%mystring%';

Wie bereits in der Frage diskutieren Sie gestern gefragt, können keine Indizes verwendet werden, und die Leistung wird schlecht sein würde, aber das könnte funktionieren:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top