Без учета регистра REPLACE в MySQL?

Дух Закона Demeter - то, что, учитывая ссылку на объект или класс, необходимо постараться не получать доступ к свойствам класса, это - больше чем одно подсвойство или метод далеко, так как это сильно свяжет эти два класса, которые могли бы быть непреднамеренными и могут вызвать проблемы пригодности для обслуживания.

Быстрые интерфейсы являются приемлемым исключением к закону, так как они , означал быть, по крайней мере, несколько сильно связанным как все свойства, и методы являются условиями мини-языка, которые составлены вместе для формирования функциональных предложений.

27
задан dkarp 13 April 2011 в 21:43
поделиться

3 ответа

Мои 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

8
ответ дан 28 November 2019 в 05:40
поделиться

В предыдущих ответах и ​​ссылке на 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

и т. Д.

0
ответ дан 28 November 2019 в 05:40
поделиться

Альтернативная функция для разговора 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

4
ответ дан 28 November 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: