在SQL中正确地大写名称

时间:2010-10-22 14:01:38

标签: mysql replace

我想正确地将名称大写,在这种情况下意味着:

  • 第一个字母大写。
  • 空格后的第一个字母大写('Van Helsing',而不是'Van helsing')
  • 短划线后的第一个字母大写('Johnson-Smith',而不是'Johnson-smith')
  • 没有其他字母大写。

第一个和最后一个要求很容易处理:

CONCAT(LEFT(name, 1), LOWER(RIGHT(name, LENGTH(name) - 1)))

其他人更难。我写了一个54次嵌套的REPLACE语句(当然不是手工,我使用Excel)

REPLACE(REPLACE(REPLACE(REPLACE(...,' b',' B'),'-b','-B'),' a',' A'),'-a','-A')

但我觉得必须有一个更优雅和可维护的解决方案。有什么想法吗?

如果内置函数与我的要求相似但不完全相同,则可能没问题。


编辑:此脚本只会在已经丢失大小写的名称上运行,因此错误处理模糊名称不会有任何危险。但是处理像空格和破折号这样的撇号会很好。浏览当前数据可以看出,许多(约30%)的名字至少有一个[ - ']。

5 个答案:

答案 0 :(得分:4)

“Van den Berg”(小写'd')怎么样?那么“麦当劳”或“奥莱利”。

过度验证人们的名字通常被认为是一个坏主意,因为总会有一个合法的名称会破坏你的验证。

另请参阅我之前对类似问题的回答:How to "Validate" Human Names in CakePHP?

答案 1 :(得分:2)

代码遇到失败后发布的内容无法正常运行...它正确地将字符串中的第一个和最后一个单词大写,并删除其间的任何内容(如果有> 2)。有人在他发布的网址上发布了更正版本...

(见Matt Cavanaugh在2009年5月15日下午3:52发表于http://dev.mysql.com/doc/refman/5.1/en/string-functions.html的帖子)

答案 2 :(得分:1)

它不会很漂亮,但您可以使用SUBSTRING_INDEX来查找第一个空格和破折号,并有条件地将任何成功资本化。

答案 3 :(得分:1)

您可以使用用户定义的函数,这将更容易重用。

答案 4 :(得分:1)

看起来MySQL没有INITCAP功能,但我在这里找到了一个代码:

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html

代码也是:

DELIMITER $$
DROP FUNCTION IF EXISTS `initcap` $$
CREATE FUNCTION `initcap`(x char(30)) RETURNS char(30) CHARSET utf8
BEGIN
SET @str='';
SET @l_str='';
WHILE x REGEXP ' ' DO
SELECT SUBSTRING_INDEX(x, ' ', 1) INTO @l_str;
SELECT SUBSTRING(x, LOCATE(' ', x)+1) INTO x;
SELECT CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(@l_str,1,1)),LOWER(SUBSTRING(@l_str,2)))) INTO @str;
END WHILE;
RETURN LTRIM(CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2)))));
END $$
DELIMITER ;

免责声明:我没有写这段代码,我甚至没有测试过它......