2016-08-31 48 views
1

下面是大写字母中每个单词首字母的MySQL函数。MySQL - 每个单词的首字母大写

USE `db`$$ 

DROP FUNCTION IF EXISTS `UC_Words`$$ 

CREATE DEFINER=`root`@`localhost` FUNCTION `UC_Words`(str VARCHAR(255)) RETURNS VARCHAR(255) CHARSET latin1 
    MODIFIES SQL DATA 
    DETERMINISTIC 
BEGIN 
DECLARE c CHAR(1); 
    DECLARE s VARCHAR(255); 
    DECLARE i INT DEFAULT 1; 
    DECLARE BOOL INT DEFAULT 1; 
    DECLARE punct CHAR(17) DEFAULT '()[]{},[email protected];:?/'; 
    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 ; 

它是所有字符串工作正常。但是如果我提供字符串“M R E”,那么它给出“M R e”输出。

PLZ建议。

回答

2

首先执行以下查询

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` FUNCTION `UC_FIRST`(oldWord VARCHAR(255)) RETURNS varchar(255) CHARSET latin1 
RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),SUBSTRING(oldWord, 2)) 

然后执行下面查询

-- -------------------------------------------------------------------------------- 
-- Routine DDL 
-- Note: comments before and after the routine body will not be stored by the server 
-- -------------------------------------------------------------------------------- 
DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` FUNCTION `UC_Words`(oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL) RETURNS varchar(255) CHARSET latin1 
BEGIN 
    SET @oldString := oldName; 
    SET @newString := ""; 

    tokenLoop: LOOP 
    IF trimSpaces THEN SET @oldString := TRIM(BOTH " " FROM @oldString); END IF; 

    SET @splitPoint := LOCATE(delim, @oldString); 

    IF @splitPoint = 0 THEN 
     SET @newString := CONCAT(@newString, UC_FIRST(@oldString)); 
     LEAVE tokenLoop; 
    END IF; 

    SET @newString := CONCAT(@newString, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint))); 
    SET @oldString := SUBSTRING(@oldString, @splitPoint+1); 
    END LOOP tokenLoop; 

    RETURN @newString; 
END 

然后后呼叫功能

SELECT UC_Words("this is for testing"," ", TRUE); 

输出下面

This Is For Testing 
相关问题