2011-08-30 53 views
0

我有一个表与表用mysql字符串函数

abcd 
abcd , pgw 
ABcd , Pgw 

以下数据我想输出

Abcd 
Abcd , Pgw 
Abcd , Pgw 

资本在首都的第一个字母和字母后“”。

+0

你必须给我们更多的信息.​​.. – juankysmith

+0

那么“一二三”呢?应该是“一二三”还是“一二三”? – Phil

+1

@phil:一个两个,三个 –

回答

2

,使第一个字母大写使用

select CONCAT(UPPER(LEFT(`field`, 1)), SUBSTRING(`field`, 2)) from mytable 

做到这一点也给逗号后字声明像一个函数:

DELIMITER || 

CREATE FUNCTION `ucwords`(str VARCHAR(128)) RETURNS VARCHAR(128) CHARSET latin1 
BEGIN 
    DECLARE c CHAR(1); 
    DECLARE s VARCHAR(128); 
    DECLARE i INT DEFAULT 1; 
    DECLARE BOOL INT DEFAULT 1;   
    SET s = LCASE(str); 
    WHILE i < LENGTH(str) DO 
    BEGIN 
     SET c = SUBSTRING(s, i, 1); 
     IF c = ',' 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;    
      END IF; 
     END; 
     END IF; 
     SET i = i+1; 
    END; 
    END WHILE; 
    RETURN s; 
END || 

DELIMITER ; 

,并使用

select ucwords(`field`) from mytable 
+0

:它不working.please再次阅读问题 –

+0

我更新答案 –

0

看看这个解决方案mysql-update-script-problem-all-txt-is-lower-case-just-first-letter-is-upper-cas,它应该给你足够的信息来适应你想要的东西O操作。将更新更改为SELECT等。

+0

它不起作用 –

+0

它从来不是一个完整的工作解决方案,只是想让你知道你能做什么,你实际上也需要自己做一些工作。你究竟做了什么没有工作?发布你刚刚尝试过的更新。 –

1

请不要这样做,如果你永远期望您的数据库能够很好地扩展。如果您只是将它用于个人电话簿应用程序或同样微小的数据集,那么您可以按照您的建议在select时间内完成此操作。但是,如果你想要一个健壮的可伸缩数据库,你应该牺牲时间(速度)的空间(磁盘存储空间)。 select语句上的每行函数很少能很好地进行缩放。

这样做的一个久经考验的方法是为您已有的另一列添加相同的规范,并使用插入/更新触发器以您希望的格式填充数据。

然后,只有当您必须(当数据更新时),而不是每次读取数据时,转换的成本才会发生。这样可以在整个读取中分摊成本,这在大部分数据库中都大大超过了写入的成本。

This answer显示了一个SQL公式,它似乎与您想要的接近,但我强烈建议您在触发器中使用它,而不是每select低效地运行它。