要求是根据美国英语词典替换列值中区分大小写文本
以下是示例
Colour => color
Color => Color (note that C is capitalized here)
FIBRE => FIBER
Colour/Monochrome => Color/Monochrome发布于 2012-10-09 13:22:52
此函数声称可以工作,虽然我没有检查,但在another question用户接受此作为答案
http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/
如果这不起作用,请让我知道
发布于 2012-10-09 22:25:07
试试这个:
DELIMITER $$
DROP FUNCTION IF EXISTS `replace_ci`$$
CREATE FUNCTION `replace_ci` (str TEXT, needle CHAR(255), str_rep CHAR(255))
RETURNS TEXT
DETERMINISTIC
BEGIN
DECLARE return_str TEXT DEFAULT '';
DECLARE lower_str TEXT;
DECLARE lower_needle TEXT;
DECLARE pos INT DEFAULT 1;
DECLARE old_pos INT DEFAULT 1;
SELECT lower(str) INTO lower_str;
SELECT lower(needle) INTO lower_needle;
SELECT locate(lower_needle, lower_str, pos) INTO pos;
WHILE pos > 0 DO
SELECT concat(return_str, substr(str, old_pos, pos-old_pos), str_rep) INTO return_str;
SELECT pos + char_length(needle) INTO pos;
SELECT pos INTO old_pos;
SELECT locate(lower_needle, lower_str, pos) INTO pos;
END WHILE;
SELECT concat(return_str, substr(str, old_pos, char_length(str))) INTO return_str;
/** mirror the case **/
IF (BINARY LEFT(str,1) = LOWER(LEFT(str,1))) THEN
SET return_str = LOWER(return_str);
ELSE
IF (BINARY LEFT(str,2) = UPPER(LEFT(str,2))) THEN
SET return_str = UPPER(return_str);
ELSE
SET return_str = CONCAT( UPPER(LEFT(return_str,1)), LOWER(RIGHT(return_str, LENGTH(return_str) - 1)) );
END IF;
END IF;
RETURN return_str;
END$$
DELIMITER ;我已经修改了不区分大小写的替换函数(在另一个答案中提到过),以“镜像”原始字符串的大小写
(参见/**镜像大小写后的代码部分**/)。
但是,它只检查3种情况-输入字符串是否为
但它应该适用于这三种情况-即
光纤=>光纤
光纤=>光纤
光纤=>光纤
https://stackoverflow.com/questions/12793146
复制相似问题