首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于替换保持大小写不变的文本的MySQL函数

用于替换保持大小写不变的文本的MySQL函数
EN

Stack Overflow用户
提问于 2012-10-09 13:07:32
回答 2查看 192关注 0票数 1

要求是根据美国英语词典替换列值中区分大小写文本

以下是示例

代码语言:javascript
复制
Colour => color
Color => Color (note that C is capitalized here)

FIBRE => FIBER

Colour/Monochrome => Color/Monochrome
EN

回答 2

Stack Overflow用户

发布于 2012-10-09 13:22:52

此函数声称可以工作,虽然我没有检查,但在another question用户接受此作为答案

http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/

如果这不起作用,请让我知道

票数 1
EN

Stack Overflow用户

发布于 2012-10-09 22:25:07

试试这个:

代码语言:javascript
复制
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种情况-输入字符串是否为

  • lowercase
  • uppercase
  • first字母大写

但它应该适用于这三种情况-即

光纤=>光纤

光纤=>光纤

光纤=>光纤

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12793146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档