【问题标题】:MySQL: Change case for compound namesMySQL:更改复合名称的大小写
【发布时间】:2015-02-25 20:48:45
【问题描述】:

我有一个名称全部大写的数据集,需要将它们转换为正确的报告大小写。我在 Stackoverflow 中找到了以下代码:

SET LastName = CONCAT(UPPER(SUBSTRING(LastName, 1, 1)),LOWER(SUBSTRING(LastName, 2)));

这适用于简单的姓氏:

史密斯 --> 史密斯

琼斯 --> 琼斯

但对于复合名称不太好:

范戴克 --> 范戴克

卡特史密斯 --> 卡特史密斯

有没有人开发了一些 MySQL 代码来执行以下操作:

范戴克 --> 范戴克

卡特-史密斯 --> 卡特-史密斯

我知道我们无法捕捉到所有可能的情况,但我希望有人至少解决了由破折号或空格分隔的名称转换问题。

【问题讨论】:

标签: mysql uppercase


【解决方案1】:

我在另一个网站上看到了这个问题,看看:http://www.thingy-ma-jig.co.uk/blog/30-09-2010/mysql-how-upper-case-words

他使用了一个函数。所以我希望你有权创建一个。

【讨论】:

    【解决方案2】:

    你们太有帮助了!我想出的答案是:

    CREATE FUNCTION CAP_FIRST (input VARCHAR(255))
    
    RETURNS VARCHAR(255)
    
    DETERMINISTIC
    
    BEGIN
        DECLARE len INT;
        DECLARE i INT;
    
        SET len   = CHAR_LENGTH(input);
        SET input = LOWER(input);
        SET i = 0;
    
        WHILE (i < len) DO
            IF (MID(input,i,1) = ' ' OR MID(input,i,1) = '-' OR i = 0) THEN
                IF (i < len) THEN
                    SET input = CONCAT(
                        LEFT(input,i),
                        UPPER(MID(input,i + 1,1)),
                        RIGHT(input,len - i - 1)
                    );
                END IF;
            END IF;
            SET i = i + 1;
        END WHILE;
    
        RETURN input;
    END;
    

    而且效果很好!

    【讨论】:

      【解决方案3】:

      您会认为世界上最流行的开源数据库,正如 MySQL 喜欢自称的那样,将具有使项目标题大小写(每个单词的第一个字母大写)的功能。可惜没有。

      这是我找到的最好的解决方案只需创建一个存储过程/函数就可以了

      mysql> 
      DROP FUNCTION IF EXISTS proper;
      SET GLOBAL  log_bin_trust_function_creators=TRUE;
      DELIMITER |
      CREATE FUNCTION proper( str VARCHAR(128) )
      RETURNS VARCHAR(128)
      BEGIN
      DECLARE c CHAR(1);
      DECLARE s VARCHAR(128);
      DECLARE i INT DEFAULT 1;
      DECLARE bool INT DEFAULT 1;
      DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/';
      SET s = LCASE( str );
      WHILE i <= LENGTH( str ) DO   
          BEGIN
      SET c = SUBSTRING( s, i, 1 );
      IF LOCATE( c, punct ) > 0 THEN
      SET bool = 1;
      ELSEIF bool=1 THEN
      BEGIN
      IF c >= 'a' AND c <= 'z' THEN
      BEGIN
      SET s = CONCAT(LEFT(s,i-1),UCASE(c),SUBSTRING(s,i+1));
      SET bool = 0;
      END;
      ELSEIF c >= '0' AND c <= '9' THEN
      SET bool = 0;
      END IF;
      END;
      END IF;
      SET i = i+1;
      END;
      END WHILE;
      RETURN s;
      END;
      |
      DELIMITER ;
      

      然后

      update table set LastName = properword(LastName)
      

      select proper( LastName ) as properLastName 
      from table 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2017-06-24
        • 2013-07-01
        • 2012-12-01
        • 2010-11-13
        • 2017-01-06
        相关资源
        最近更新 更多