Coloque a primeira letra em maiúscula. MySQL

110

Alguém sabe o equivalente a este TSQL no jargão do MySQL?

Estou tentando colocar a primeira letra de cada entrada em maiúscula.

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

Respostas:

275

É quase o mesmo, você só precisa mudar para usar a função CONCAT () em vez do operador +:

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

Isso mudaria hellopara Hello, wOrLdpara WOrLd, BLABLApara BLABLA, etc. Se você quiser maiúsculas a primeira letra e minúsculas a outra, você só precisa usar a função LCASE:

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

Observe que UPPER e UCASE fazem a mesma coisa.

Vincent Savard
fonte
1
obrigado - isso fez o que eu precisava. Esqueci de mencionar que precisava definir para minúsculas primeiro. obrigado
Chin
55

A excelente resposta da Vincents para a primeira letra maiúscula funciona muito bem para a primeira letra apenas em maiúscula de uma string de coluna inteira.

MAS e se você quiser maiúscula a primeira letra de CADA palavra nas strings de uma coluna da tabela?

por exemplo: "Abbeville High School"

Eu não tinha encontrado uma resposta para isso no Stackoverflow. Tive de juntar algumas respostas que encontrei no Google para fornecer uma solução sólida para o exemplo acima. Não é uma função nativa, mas uma função criada pelo usuário que o MySQL versão 5+ permite.

Se você tem status de usuário Super / Admin no MySQL ou tem uma instalação local do mysql em seu próprio computador, você pode criar uma FUNÇÃO (como um procedimento armazenado) que fica em seu banco de dados e pode ser usado em todas as consultas SQL futuras em qualquer parte do db.

A função que criei me permite usar esta nova função que chamei de "UC_Words", assim como as funções nativas integradas do MySQL para que eu possa atualizar uma coluna completa como esta:

UPDATE Table_name
SET column_name = UC_Words(column_name) 

Para inserir o código da função, alterei o delimitador padrão do MySQL (;) enquanto criava a função e, em seguida, redefini-lo ao normal após o script de criação da função. Eu também queria que a saída fosse em UTF8 CHARSET.

Criação de função =

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 ; 

Isso funciona como um tratamento para a saída de primeiras letras maiúsculas em várias palavras em uma string.

Assumindo que seu nome de usuário de login do MySQL tem privilégios suficientes - se não, e você não pode configurar um banco de dados temporário em sua máquina pessoal para converter suas tabelas, pergunte ao seu provedor de hospedagem compartilhada se ele definirá esta função para você.

Martin Sansone - MiOEE
fonte
4
CHARSET utf8_general_cideve ser alterado para CHARSET utf8(pelo menos em 5,7)
Manuel
@ManuelDallaLana na verdade você pode obter um erro, Illegal mix of collations for operation 'concat'então eu acho que apenas consertar o conjunto de caracteres ou removê-lo e torná-lo padrão.
Al-Mothafar
@Alejandro Esta resposta coloca em maiúscula a primeira letra de cada palavra na string. A pergunta e a resposta aceita colocam em maiúscula apenas a primeira letra da string. Ambas são respostas muito úteis, mas para diferentes casos de uso.
Liam
Ocorreu um erro, você deve declarar 's' com o conjunto de caracteres "DECLARE s VARCHAR (255) CHARSET utf8;" ou você perderá alguns personagens. Obrigado por esta solução de qualquer maneira :-)
Jérôme Herry
E também 'c': "DECLARAR c CHAR (1) CHARSET utf8;"
Jérôme Herry
17

Você pode usar uma combinação de UCASE(), MID()e CONCAT():

SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
Wouter Dorgelo
fonte
isso não diminui todas as outras letras. TenteSELECT CONCAT(UCASE(MID('TEST',1,1)),MID('TEST',2));
vladkras
8
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

Raiz
fonte
5

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

Se houver mais de 1 palavra na coluna, isso não funcionará conforme mostrado abaixo. A UDF mencionada acima pode ajudar nesse caso.

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)

Ou talvez este ajude ...

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

Shantanuo
fonte
2

Isso está funcionando bem.

UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2)));
Abhinav Sahu
fonte
1
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) + 
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Jasdeep Singh
fonte
Eu estava apenas tentando destacar a função UCASE no MySQL: P :)
Jasdeep Singh
1

CRIE UMA FUNÇÃO:

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

USE A FUNÇÃO

UPDATE tbl_name SET col_name = UC_FIRST(col_name);
Florim
fonte
1

Se alguém tentar capitalizar cada palavra, separar por espaço ...

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;

Resultado

+--------------+
| name         |
+--------------+
| Abdul Karim  | 
+--------------+
Jahir islam
fonte
0

Isso deve funcionar bem:

UPDATE tb_Company SET CompanyIndustry = 
CONCAT(UPPER(LEFT(CompanyIndustry, 1)), SUBSTRING(CompanyIndustry, 2))
Chris Hutchinson
fonte
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)));
Sandeep Kumar
fonte
0
 select  CONCAT(UCASE(LEFT('CHRIS', 1)),SUBSTRING(lower('CHRIS'),2));

A afirmação acima pode ser usada para a primeira letra em CAPS e as restantes como minúsculas.

Aamir Khan
fonte
-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 ;
Hton
fonte