代码之家  ›  专栏  ›  技术社区  ›  Charles

在SQL中正确大写名称

  •  3
  • Charles  · 技术社区  · 14 年前

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

    • 空格后的第一个字母大写(“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 回复  |  直到 14 年前
        1
  •  2
  •   Jimmy Mensinger    13 年前

    发送表单的代码fructedWithForms不能正确工作…它正确地将字符串中的第一个和最后一个单词大写,并删除其中的任何内容(如果有>2)。有人在他发布的网址上发布了一个修正版。。。

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

        2
  •  4
  •   Community THelper    7 年前

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

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

        3
  •  1
  •   Marcelo Cantos    14 年前

    SUBSTRING_INDEX 找到第一个空格和破折号,并有条件地利用它后面的任何内容。

        4
  •  1
  •   David Mårtensson    14 年前

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

        5
  •  1
  •   FrustratedWithFormsDesigner    14 年前

    看起来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 ;