Viết hoa chữ cái đầu tiên. MySQL


110

Có ai biết tương đương với TSQL này trong cách nói của MySQL không?

Tôi đang cố viết hoa chữ cái đầu tiên của mỗi mục nhập.

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

Câu trả lời:


275

Nó gần giống nhau, bạn chỉ cần thay đổi để sử dụng hàm CONCAT () thay vì toán tử +:

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

Điều này sẽ chuyển hellothành Hello, wOrLdthành WOrLd, BLABLAđến BLABLA, v.v. Nếu bạn muốn viết hoa chữ cái đầu tiên và viết thường chữ cái kia, bạn chỉ cần sử dụng hàm LCASE:

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

Lưu ý rằng UPPER và UCASE làm điều tương tự.


1
cảm ơn - điều đó đã làm những gì tôi cần. Tôi quên đề cập rằng tôi cần đặt thành chữ thường trước. cảm ơn
Chin

55

Câu trả lời xuất sắc của Vincents cho Chữ cái đầu tiên viết hoa hoạt động tuyệt vời cho chữ cái đầu tiên chỉ viết hoa của toàn bộ chuỗi cột ..

NHƯNG điều gì xảy ra nếu bạn muốn viết hoa Chữ cái đầu tiên của MỌI từ trong các chuỗi của cột bảng?

ví dụ: "Abbeville High School"

Tôi đã không tìm thấy câu trả lời cho điều này trong Stackoverflow. Tôi đã phải tập hợp một số câu trả lời mà tôi tìm thấy trên Google để đưa ra giải pháp vững chắc cho ví dụ trên. Nó không phải là một hàm gốc mà là một hàm do người dùng tạo ra mà MySQL phiên bản 5+ cho phép.

Nếu bạn có trạng thái người dùng Super / Admin trên MySQL hoặc có cài đặt mysql cục bộ trên máy tính của riêng mình, bạn có thể tạo FUNCTION (giống như một quy trình được lưu trữ) nằm trong cơ sở dữ liệu của bạn và có thể được sử dụng trong tất cả các truy vấn SQL trong tương lai trên bất kỳ phần nào của db.

Hàm tôi đã tạo cho phép tôi sử dụng hàm mới này mà tôi gọi là "UC_Words" giống như các hàm gốc tích hợp sẵn của MySQL để tôi có thể cập nhật một cột hoàn chỉnh như sau:

UPDATE Table_name
SET column_name = UC_Words(column_name) 

Để chèn mã hàm, tôi đã thay đổi dấu phân cách chuẩn MySQL (;) trong khi tạo hàm, rồi đặt lại nó trở lại bình thường sau tập lệnh tạo hàm. Cá nhân tôi cũng muốn đầu ra ở dạng UTF8 CHARSET.

Tạo hàm =

DELIMITER ||  

CREATE FUNCTION `UC_Words`( str VARCHAR(255) ) RETURNS VARCHAR(255) CHARSET utf8 DETERMINISTIC  
BEGIN  
  DECLARE c CHAR(1);  
  DECLARE s VARCHAR(255);  
  DECLARE i INT DEFAULT 1;  
  DECLARE bool INT DEFAULT 1;  
  DECLARE punct CHAR(17) DEFAULT ' ()[]{},.-_!@;:?/';  
  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 ; 

Điều này hoạt động để xử lý xuất ra các chữ cái đầu tiên viết hoa trên nhiều từ trong một chuỗi.

Giả sử tên người dùng đăng nhập MySQL của bạn có đủ đặc quyền - nếu không, và bạn không thể thiết lập DB tạm thời trên máy cá nhân để chuyển đổi các bảng của mình, thì hãy hỏi nhà cung cấp dịch vụ lưu trữ chia sẻ của bạn xem họ có đặt chức năng này cho bạn không.


4
CHARSET utf8_general_cinên được đổi thành CHARSET utf8(ít nhất là vào ngày 5.7)
Manuel

@ManuelDallaLana thực sự bạn có thể gặp lỗi Illegal mix of collations for operation 'concat'vì vậy tôi nghĩ chỉ cần sửa bộ ký tự hoặc xóa nó và đặt nó về mặc định.
Al-Mothafar

@Alejandro Câu trả lời này viết hoa chữ cái đầu tiên của mỗi từ trong chuỗi. Câu hỏi và câu trả lời được chấp nhận chỉ viết hoa chữ cái đầu tiên trong chuỗi. Chúng đều là những câu trả lời siêu hữu ích nhưng dành cho các trường hợp sử dụng khác nhau.
Liam

Có lỗi, bạn phải khai báo 's' bằng bộ ký tự "DECLARE s VARCHAR (255) CHARSET utf8;" hoặc bạn sẽ mất một số ký tự. Dù sao cũng cảm ơn giải pháp này :-)
Jérôme Herry

Và cả 'c': "DECLARE c CHAR (1) CHARSET utf8;"
Jérôme Herry

17

Bạn có thể sử dụng kết hợp UCASE(), MID()CONCAT():

SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;

điều này không làm giảm tất cả các chữ cái khác. Hãy thửSELECT CONCAT(UCASE(MID('TEST',1,1)),MID('TEST',2));
vladkras


5

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

Nếu có nhiều hơn 1 từ trong cột, thì điều này sẽ không hoạt động như hình dưới đây. UDF được đề cập ở trên có thể giúp ích trong trường hợp đó.

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)

Hoặc có thể cái này sẽ giúp ...

https://github.com/mysqludf/lib_mysqludf_str#str_ucwords


2

Điều này đang hoạt động tốt.

UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2)));

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

tôi chỉ cố gắng để làm nổi bật các chức năng UCase trong MySQL: P :)
Jasdeep Singh

1

TẠO MỘT CHỨC NĂNG:

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)))

SỬ DỤNG CHỨC NĂNG

UPDATE tbl_name SET col_name = UC_FIRST(col_name);

1

Nếu ai đó cố gắng viết hoa mỗi từ cách nhau bằng dấu cách ...

CREATE FUNCTION response(name VARCHAR(40)) RETURNS VARCHAR(200) DETERMINISTIC
BEGIN
   set @m='';
   set @c=0;
   set @l=1;
   while @c <= char_length(name)-char_length(replace(name,' ','')) do
      set @c = @c+1;
      set @p = SUBSTRING_INDEX(name,' ',@c);
      set @k = substring(name,@l,char_length(@p)-@l+1);
      set @l = char_length(@k)+2;
      set @m = concat(@m,ucase(left(@k,1)),lcase(substring(@k,2)),' ');
   end while;
   return trim(@m); 
END;
CREATE PROCEDURE updateNames()
BEGIN
  SELECT response(name) AS name FROM names;
END;

Kết quả

+--------------+
| name         |
+--------------+
| Abdul Karim  | 
+--------------+

0

Điều này sẽ hoạt động tốt:

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

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)));

0
 select  CONCAT(UCASE(LEFT('CHRIS', 1)),SUBSTRING(lower('CHRIS'),2));

Câu lệnh trên có thể được sử dụng cho chữ viết hoa đầu tiên và phần còn lại là chữ thường.


-1

Uso algo simples assim;)

DELIMITER $$
DROP FUNCTION IF EXISTS `uc_frist` $$
CREATE FUNCTION `uc_frist` (str VARCHAR(200)) RETURNS varchar(200)
BEGIN
    set str:= lcase(str);
    set str:= CONCAT(UCASE(LEFT(str, 1)),SUBSTRING(str, 2));
    set str:= REPLACE(str, ' a', ' A');
    set str:= REPLACE(str, ' b', ' B');
    set str:= REPLACE(str, ' c', ' C');
    set str:= REPLACE(str, ' d', ' D');
    set str:= REPLACE(str, ' e', ' E');
    set str:= REPLACE(str, ' f', ' F');
    set str:= REPLACE(str, ' g', ' G');
    set str:= REPLACE(str, ' h', ' H');
    set str:= REPLACE(str, ' i', ' I');
    set str:= REPLACE(str, ' j', ' J');
    set str:= REPLACE(str, ' k', ' K');
    set str:= REPLACE(str, ' l', ' L');
    set str:= REPLACE(str, ' m', ' M');
    set str:= REPLACE(str, ' n', ' N');
    set str:= REPLACE(str, ' o', ' O');
    set str:= REPLACE(str, ' p', ' P');
    set str:= REPLACE(str, ' q', ' Q');
    set str:= REPLACE(str, ' r', ' R');
    set str:= REPLACE(str, ' s', ' S');
    set str:= REPLACE(str, ' t', ' T');
    set str:= REPLACE(str, ' u', ' U');
    set str:= REPLACE(str, ' v', ' V');
    set str:= REPLACE(str, ' w', ' W');
    set str:= REPLACE(str, ' x', ' X');
    set str:= REPLACE(str, ' y', ' Y');
    set str:= REPLACE(str, ' z', ' Z');
    return  str;
END $$
DELIMITER ;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.