2010-11-24 134 views
78

在MySQL中,有沒有人知道這個TSQL的等價物?首字母大寫。 MySQL

我想大寫每個條目的第一個字母。

UPDATE tb_Company SET CompanyIndustry = UPPER(LEFT(CompanyIndustry, 1)) 
+ SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry)) 

回答

194

這幾乎是一樣的,你只需要改變使用CONCAT()函數,而不是+運營商:

UPDATE tb_Company 
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)), 
          SUBSTRING(CompanyIndustry, 2)); 

這將使hello變爲HellowOrLdWOrLdBLABLABLABLA等,如果你想爲大寫首字母和小寫其他的,你只需要使用LCASE函數:

UPDATE tb_Company 
SET CompanyIndustry = CONCAT(UCASE(LEFT(CompanyIndustry, 1)), 
          LCASE(SUBSTRING(CompanyIndustry, 2))); 

注意UPPER和UCASE做一樣的東西。

16

您可以使用UCASE()MID()CONCAT()組合:

SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names; 
1
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) + 
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry)) 
+1

這是行不通的,+不毗連運算符與MySQL。 – 2010-11-24 03:47:32

+1

由Enrico Pallazzo發佈的答案應該工作得很好 – 2010-11-24 03:49:56

+0

我只是試圖強調MySQL中的UCASE功能:P :) – 2010-11-24 03:51:50

0

這應該很好地工作:

UPDATE tb_Company SET CompanyIndustry = 
CONCAT(UPPER(LEFT(CompanyIndustry, 1)), SUBSTRING(CompanyIndustry, 2)) 
5

http://forge.mysql.com/tools/tool.php?id=201

如果有在列超過100個字,那麼這將不會如下圖所示工作。 上面提到的UDF可能有助於這種情況。

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) 

或者,也許這個人會幫...

http://www.mysqludf.org/lib_mysqludf_str/index.php#str_ucwords

7
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#function_mid

2

這是工作很好。

UPDATE SET狀態名稱= CONCAT(UCASE(LEFT(姓名,1)), LCASE(SUBSTRING(名稱,2)));

30

大寫首先信文森出色答卷的第一個字母市值一整列字符串的偉大工程..

但如果你想爲大寫每個單詞的第一個字母是什麼在表列的字符串?

如:「阿布維爾高中」

我還沒有發現#1的答案。我不得不拼湊一些我在Google中找到的答案,以便爲上述示例提供一個可靠的解決方案。它不是本地函數,而是MySQL版本5+允許的用戶創建的函數。

如果您在MySQL上擁有超級用戶/管理員用戶狀態,或者在您自己的計算機上安裝了本地mysql安裝,則可以創建一個函數(如存儲過程),該函數位於您的數據庫中,可用於將來的所有SQL查詢數據庫的任何部分。

我創建的函數允許我使用這個新功能,我稱之爲「UC_Words」就像建在MySQL的原生功能,這樣我就可以更新這樣一個完整的列:

UPDATE Table_name 
SET column_name = UC_Words(column_name) 

要插入函數代碼,我在創建函數時更改了MySQL標準分隔符(;),然後在函數創建腳本之後將其重置爲正常。我也親自希望輸出爲UTF8 CHARSET。

功能創建=

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 '()[]{},[email protected];:?/'; 
    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

創建一個函數:

CREATE DEFINER=`root`@`localhost` FUNCTION `UC_FIRST`(`oldWord` VARCHAR(255)) 

RETURNS varchar(255) CHARSET utf8 

RETURN CONCAT(UCASE(LEFT(oldWord, 1)), LCASE(SUBSTRING(oldWord, 2))) 

使用的功能

UPDATE tbl_name SET col_name = UC_FIRST(col_name); 
0
UPDATE users 
SET first_name = CONCAT(UCASE(LEFT(first_name, 1)), 
          LCASE(SUBSTRING(first_name, 2))) 
,last_name = CONCAT(UCASE(LEFT(last_name, 1)), 
          LCASE(SUBSTRING(last_name, 2)));