Дух Закона Demeter - то, что, учитывая ссылку на объект или класс, необходимо постараться не получать доступ к свойствам класса, это - больше чем одно подсвойство или метод далеко, так как это сильно свяжет эти два класса, которые могли бы быть непреднамеренными и могут вызвать проблемы пригодности для обслуживания.
Быстрые интерфейсы являются приемлемым исключением к закону, так как они , означал быть, по крайней мере, несколько сильно связанным как все свойства, и методы являются условиями мини-языка, которые составлены вместе для формирования функциональных предложений.
Мои 2 цента.
Так как многие люди обновили MySQL до MariaDB, им будет доступна новая функция под названием REGEXP_REPLACE
. Используйте его как обычную замену, но шаблон является регулярным выражением.
Это рабочий пример:
UPDATE `myTable`
SET `myField` = REGEXP_REPLACE(`myField`, '(?i)my insensitive string', 'new string')
WHERE `myField` REGEXP '(?i)my insensitive string'
Опция (?i)
делает все последующие совпадения нечувствительными к регистру (если поместить в начало шаблона, как у меня, то все будет нечувствительным).
См. Здесь для получения дополнительной информации: https://mariadb.com/kb/en/mariadb/pcre/
Редактировать: начиная с MySQL 8.0 теперь вы можете использовать regexp_replace
также см. документацию: https://dev.mysql.com/doc/refman/8.0/en/regexp.html
В предыдущих ответах и ссылке на pento.net аргументы LOCATE()
в нижнем регистре.
Это пустая трата ресурсов, поскольку LOCATE по умолчанию не учитывает регистр:
mysql> select locate('el', 'HELLo');
+-----------------------+
| locate('el', 'HELLo') |
+-----------------------+
| 2 |
+-----------------------+
Вы можете заменить
WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0 DO
на
WHILE Locate(REPLACE_THIS, REPLACE_WHERE, last_occurency ) > 0 DO
и т. Д.
Альтернативная функция для разговора 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 ;
Малый тест:
SET @str = BINARY 'New York';
SELECT case_insensitive_replace(@str, 'y', 'K');
Ответы: New Kork