Case-insensitive REPLACE In MySQL?


Answer :

If replace(lower()) doesn't work, you'll need to create another function.


My 2 cents.

Since many people have upgraded from MySQL to MariaDB those people will have available a new function called REGEXP_REPLACE. Use it as you would a normal replace, but the pattern is a regular expression.

This is a working example:

UPDATE `myTable` SET `myField` = REGEXP_REPLACE(`myField`, '(?i)my insensitive string', 'new string')  WHERE `myField` REGEXP '(?i)my insensitive string' 

The option (?i) makes all the subsequent matches case insensitive (if put at the beginning of the pattern like I have then it all is insensitive).

See here for more information: https://mariadb.com/kb/en/mariadb/pcre/

Edit: as of MySQL 8.0 you can now use the regexp_replace function too, see documentation: https://dev.mysql.com/doc/refman/8.0/en/regexp.html


Alternative function for one spoken by fvox.

DELIMITER | CREATE FUNCTION case_insensitive_replace ( REPLACE_WHERE text, REPLACE_THIS text, REPLACE_WITH text ) RETURNS text DETERMINISTIC  BEGIN     DECLARE last_occurency int DEFAULT '1';      IF LCASE(REPLACE_THIS) = LCASE(REPLACE_WITH) OR LENGTH(REPLACE_THIS) < 1 THEN          RETURN REPLACE_WHERE;     END IF;      WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0  DO       BEGIN         SET last_occurency = Locate(LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE));          SET REPLACE_WHERE = Insert( REPLACE_WHERE, last_occurency, LENGTH(REPLACE_THIS), REPLACE_WITH);          SET last_occurency = last_occurency + LENGTH(REPLACE_WITH);       END;     END WHILE;     RETURN REPLACE_WHERE; END; | DELIMITER ; 

Small test:

SET @str = BINARY 'New York'; SELECT case_insensitive_replace(@str, 'y', 'K'); 

Answers: New Kork


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?