Ponga en mayúscula la primera letra. MySQL

110

¿Alguien sabe el equivalente a este TSQL en el lenguaje de MySQL?

Estoy tratando de poner en mayúscula la primera letra de cada entrada.

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

Respuestas:

275

Es casi lo mismo, solo tienes que cambiar para usar la función CONCAT () en lugar del operador +:

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

Esto cambiaría helloa Hello, wOrLda WOrLd, BLABLAa BLABLA, etc. Si desea poner en mayúsculas la primera letra y en minúsculas la otra, solo tiene que usar la función LCASE:

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

Tenga en cuenta que UPPER y UCASE hacen lo mismo.

Vincent Savard
fuente
1
gracias - eso hizo lo que necesitaba. Olvidé mencionar que primero tenía que configurarlo en minúsculas. gracias
Chin
55

Vincent excelente respuesta para mayúsculas Primera Carta funciona muy bien para la primera letra única capitalización de una cadena columna entera ..

PERO, ¿qué pasa si quieres poner en mayúsculas la primera letra de CADA palabra? en las cadenas de una columna de la tabla?

por ejemplo: "Abbeville High School"

No había encontrado una respuesta a esto en Stackoverflow. Tuve que improvisar algunas respuestas que encontré en Google para proporcionar una solución sólida al ejemplo anterior. No es una función nativa, sino una función creada por el usuario que permite MySQL versión 5+.

Si tiene un estado de usuario Super / Admin en MySQL o tiene una instalación local de mysql en su propia computadora, puede crear una FUNCIÓN (como un procedimiento almacenado) que se encuentra en su base de datos y se puede usar en todas las consultas SQL futuras en cualquier parte del db.

La función que creé me permite usar esta nueva función que llamé "UC_Words" al igual que las funciones nativas integradas de MySQL para poder actualizar una columna completa como esta:

UPDATE Table_name
SET column_name = UC_Words(column_name) 

Para insertar el código de la función, cambié el delimitador estándar de MySQL (;) mientras creaba la función, y luego lo restablecí a la normalidad después del script de creación de la función. También personalmente quería que la salida estuviera en UTF8 CHARSET.

Creación de función =

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 ; 

Esto funciona de maravilla al generar primeras letras mayúsculas en varias palabras dentro de una cadena.

Suponiendo que su nombre de usuario de inicio de sesión de MySQL tiene suficientes privilegios, si no es así, y no puede configurar una base de datos temporal en su máquina personal para convertir sus tablas, pregúntele a su proveedor de alojamiento compartido si establecerá esta función por usted.

Martin Sansone - MiOEE
fuente
4
CHARSET utf8_general_cidebe cambiarse a CHARSET utf8(al menos el 5.7)
Manuel
@ManuelDallaLana en realidad podría obtener un error, Illegal mix of collations for operation 'concat'así que creo que simplemente corrija el juego de caracteres o elimínelo y configúrelo como predeterminado.
Al-Mothafar
@Alejandro Esta respuesta escribe en mayúscula la primera letra de cada palabra en la cadena. La pregunta y la respuesta aceptada solo escriben en mayúscula la primera letra de la cadena. Ambas son respuestas súper útiles pero para diferentes casos de uso.
Liam
Hay un error, debe declarar 's' con el juego de caracteres "DECLARE s VARCHAR (255) CHARSET utf8;" o perderás algunos personajes. Gracias por esta solución de todos modos :-)
Jérôme Herry
Y también 'c': "DECLARE c CHAR (1) CHARSET utf8;"
Jérôme Herry
17

Se puede utilizar una combinación de UCASE(), MID()y CONCAT():

SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
Wouter Dorgelo
fuente
esto no reduce todas las demás letras. TrySELECT 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

Raíz
fuente
5

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

Si hay más de 1 palabra en la columna, esto no funcionará como se muestra a continuación. La UDF mencionada anteriormente puede ayudar en tal 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)

O tal vez este ayude ...

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

shantanuo
fuente
2

Esto está funcionando muy bien.

UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2)));
Abhinav Sahu
fuente
1
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) + 
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Jasdeep Singh
fuente
Solo estaba tratando de resaltar la función UCASE en MySQL: P :)
Jasdeep Singh
1

CREA UNA FUNCIÓN:

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

UTILIZAR LA FUNCIÓN

UPDATE tbl_name SET col_name = UC_FIRST(col_name);
Florín
fuente
1

Si alguien intenta poner en mayúscula cada palabra separada por espacio ...

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  | 
+--------------+
Islam jahir
fuente
0

Esto debería funcionar bien:

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

La declaración anterior se puede utilizar para la primera letra MAYÚSCULAS y el resto como minúsculas.

Aamir Khan
fuente
-1

Uso algo simple 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
fuente