Capitalize first letter. MySQL
用mysql的说法,有人知道这个tsql的等价物吗?
我正试图把每个条目的第一个字母大写。
1 2 |
几乎是一样的,只需更改即可使用concat()函数而不是+运算符:
1 2 3 |
这将使
1 2 3 |
注意upper和ucase做同样的事情。
文森特对大写第一个字母的完美回答对于整个列字符串的第一个字母大写效果很好。
但是,如果您想将表列字符串中每个单词的第一个字母大写怎么办?
例如:"阿贝维尔高中"
我在StackOverflow中没有找到答案。我不得不拼凑出一些我在谷歌找到的答案,为上面的例子提供一个可靠的解决方案。它不是一个本机函数,而是一个用户创建的函数,MySQL5+版允许这样做。
如果您在mysql上有super/admin用户状态,或者在自己的计算机上安装了本地mysql,那么您可以创建一个函数(如存储过程),该函数位于数据库中,并且可以在将来对数据库的任何部分使用SQL查询。
我创建的函数允许我使用这个我称为"uc-words"的新函数,就像mysql内置的本机函数一样,这样我就可以更新一个完整的列,如下所示:
为了插入函数代码,我在创建函数时更改了MySQL标准分隔符(;),然后在函数创建脚本之后将其重置为正常值。我个人也希望输出也是utf8字符集。
函数创建=
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | DELIMITER || CREATE FUNCTION `UC_Words`( str VARCHAR(255) ) RETURNS VARCHAR(255) CHARSET utf8_general_ci BEGIN DECLARE c CHAR(1); DECLARE s VARCHAR(255); 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 ; |
这是一种在字符串中多个单词上输出大写首字母的处理方法。
假设您的MySQL登录用户名有足够的权限(如果没有),并且您无法在个人计算机上设置临时数据库来转换表,那么请询问共享宿主提供程序是否将为您设置此功能。
您可以使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> SELECT schedule_type AS Schedule FROM ad_campaign limit 1; +----------+ | Schedule | +----------+ | ENDDATE | +----------+ 1 row in set (0.00 sec) mysql> SELECT CONCAT(UCASE(MID(schedule_type,1,1)),LCASE(MID(schedule_type,2))) AS Schedule FROM ad_campaign limit 1; +----------+ | Schedule | +----------+ | Enddate | +----------+ 1 row in set (0.00 sec) |
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html函数mid
http://forge.mysql.com/tools/tool.php?ID=201
如果列中有超过1个单词,则此操作将不起作用,如下所示。在这种情况下,上述UDF可能会有所帮助。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> select * from names; +--------------+ | name | +--------------+ | john abraham | +--------------+ 1 row in set (0.00 sec) mysql> SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names; +--------------+ | name | +--------------+ | John abraham | +--------------+ 1 row in set (0.00 sec) |
或者这个会有帮助…
https://github.com/mysqludf/lib_mysqludf_str_str_ucwords
这很管用。
UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)),
LCASE(SUBSTRING(name, 2)));
If anyone try to capitalize the every word separate by space...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | CREATE FUNCTION response(name VARCHAR(40)) RETURNS VARCHAR(200) DETERMINISTIC BEGIN set @m=''; set @c=0; set @l=1; while @c <= char_length(name)-char_length(replace(name,' ','')) do set @c = @c+1; set @p = SUBSTRING_INDEX(name,' ',@c); set @k = substring(name,@l,char_length(@p)-@l+1); set @l = char_length(@k)+2; set @m = concat(@m,ucase(left(@k,1)),lcase(substring(@k,2)),' '); end while; return trim(@m); END; CREATE PROCEDURE updateNames() BEGIN SELECT response(name) AS name FROM names; END; |
Result
1 2 3 4 5 | +--------------+ | name | +--------------+ | Abdul Karim | +--------------+ |
创建函数:
1 2 3 4 5 |
使用函数
1 2 |
上面的语句可用于第一个字母的大写,其余的用作小写。
1 2 3 4 5 |
这应该很好地工作:
1 2 |
uso algo simples assim;)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | DELIMITER $$ DROP FUNCTION IF EXISTS `uc_frist` $$ CREATE FUNCTION `uc_frist` (str VARCHAR(200)) RETURNS varchar(200) BEGIN set str:= lcase(str); set str:= CONCAT(UCASE(LEFT(str, 1)),SUBSTRING(str, 2)); set str:= REPLACE(str, ' a', ' A'); set str:= REPLACE(str, ' b', ' B'); set str:= REPLACE(str, ' c', ' C'); set str:= REPLACE(str, ' d', ' D'); set str:= REPLACE(str, ' e', ' E'); set str:= REPLACE(str, ' f', ' F'); set str:= REPLACE(str, ' g', ' G'); set str:= REPLACE(str, ' h', ' H'); set str:= REPLACE(str, ' i', ' I'); set str:= REPLACE(str, ' j', ' J'); set str:= REPLACE(str, ' k', ' K'); set str:= REPLACE(str, ' l', ' L'); set str:= REPLACE(str, ' m', ' M'); set str:= REPLACE(str, ' n', ' N'); set str:= REPLACE(str, ' o', ' O'); set str:= REPLACE(str, ' p', ' P'); set str:= REPLACE(str, ' q', ' Q'); set str:= REPLACE(str, ' r', ' R'); set str:= REPLACE(str, ' s', ' S'); set str:= REPLACE(str, ' t', ' T'); set str:= REPLACE(str, ' u', ' U'); set str:= REPLACE(str, ' v', ' V'); set str:= REPLACE(str, ' w', ' W'); set str:= REPLACE(str, ' x', ' X'); set str:= REPLACE(str, ' y', ' Y'); set str:= REPLACE(str, ' z', ' Z'); return str; END $$ DELIMITER ; |