2011-08-30 77 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低效地運行它。