Mettez la première lettre en majuscule. MySQL

110

Quelqu'un connaît-il l'équivalent de ce TSQL dans le langage MySQL?

J'essaye de mettre en majuscule la première lettre de chaque entrée.

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

Réponses:

275

C'est presque la même chose, il suffit de changer pour utiliser la fonction CONCAT () au lieu de l'opérateur +:

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

Cela tournerait helloà Hello, wOrLdà WOrLd, BLABLAà BLABLA, etc. Si vous voulez en majuscules la première lettre et minuscules l'autre, il vous suffit d'utiliser la fonction LCASE:

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

Notez que UPPER et UCASE font la même chose.

Vincent Savard
la source
1
merci - cela a fait ce dont j'avais besoin. J'ai oublié de mentionner que je devais d'abord définir les minuscules. merci
Chin
55

Vincents excellente réponse pour la première lettre majuscule fonctionne très bien pour la première lettre uniquement la mise en majuscule d'une chaîne de colonne entière.

MAIS que se passe-t-il si vous souhaitez mettre en majuscule la première lettre de CHAQUE mot dans les chaînes d'une colonne de tableau?

ex: "Abbeville High School"

Je n'avais pas trouvé de réponse à cela dans Stackoverflow. J'ai dû concocter quelques réponses que j'ai trouvées dans Google pour fournir une solution solide à l'exemple ci-dessus. Ce n'est pas une fonction native mais une fonction créée par l'utilisateur que MySQL version 5+ permet.

Si vous avez le statut d'utilisateur Super / Admin sur MySQL ou si vous avez une installation mysql locale sur votre propre ordinateur, vous pouvez créer une FONCTION (comme une procédure stockée) qui se trouve dans votre base de données et peut être utilisée dans toutes les futures requêtes SQL sur n'importe quelle partie du db.

La fonction que j'ai créée me permet d'utiliser cette nouvelle fonction que j'ai appelée "UC_Words" tout comme les fonctions natives intégrées de MySQL afin que je puisse mettre à jour une colonne complète comme celle-ci:

UPDATE Table_name
SET column_name = UC_Words(column_name) 

Pour insérer le code de fonction, j'ai changé le délimiteur standard MySQL (;) lors de la création de la fonction, puis je l'ai réinitialisé à la normale après le script de création de fonction. Personnellement, je voulais aussi que la sortie soit en UTF8 CHARSET.

Création de fonction =

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 ; 

Cela fonctionne un régal de sortie des premières lettres majuscules sur plusieurs mots dans une chaîne.

En supposant que votre nom d'utilisateur de connexion MySQL dispose de privilèges suffisants - sinon, et que vous ne pouvez pas configurer une base de données temporaire sur votre machine personnelle pour convertir vos tables, demandez à votre fournisseur d'hébergement partagé s'il définira cette fonction pour vous.

Martin Sansone - MiOEE
la source
4
CHARSET utf8_general_cidevrait être changé en CHARSET utf8(au moins le 5.7)
Manuel
@ManuelDallaLana en fait, vous pourriez obtenir une erreur, Illegal mix of collations for operation 'concat'donc je pense qu'il suffit de réparer le jeu de caractères ou de le supprimer et de le définir par défaut.
Al-Mothafar
@Alejandro Cette réponse met en majuscule la première lettre de chaque mot de la chaîne. La question et la réponse acceptée ne mettent en majuscule que la première lettre de la chaîne. Ce sont tous les deux des réponses très utiles, mais pour des cas d'utilisation différents.
Liam
Il y a une erreur, vous devez déclarer 's' avec le jeu de caractères "DECLARE s VARCHAR (255) CHARSET utf8;" ou vous perdrez certains caractères. Merci pour cette solution quand même :-)
Jérôme Herry
Et aussi 'c': "DECLARE c CHAR (1) CHARSET utf8;"
Jérôme Herry
17

Vous pouvez utiliser une combinaison de UCASE(), MID()et CONCAT():

SELECT CONCAT(UCASE(MID(name,1,1)),MID(name,2)) AS name FROM names;
Wouter Dorgelo
la source
cela n'abaisse pas toutes les autres lettres. EssayezSELECT 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

Racine
la source
5

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

S'il y a plus d'un mot dans la colonne, cela ne fonctionnera pas comme indiqué ci-dessous. L'UDF mentionné ci-dessus peut aider dans ce cas.

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 peut-être que celui-ci aidera ...

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

shantanuo
la source
2

Cela fonctionne bien.

UPDATE state SET name = CONCAT(UCASE(LEFT(name, 1)), LCASE(SUBSTRING(name, 2)));
Abhinav Sahu
la source
1
UPDATE tb_Company SET CompanyIndustry = UCASE(LEFT(CompanyIndustry, 1)) + 
SUBSTRING(CompanyIndustry, 2, LEN(CompanyIndustry))
Jasdeep Singh
la source
J'essayais juste de mettre en évidence la fonction UCASE dans MySQL: P :)
Jasdeep Singh
1

CRÉER UNE FONCTION:

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

UTILISEZ LA FONCTION

UPDATE tbl_name SET col_name = UC_FIRST(col_name);
Florin
la source
1

Si quelqu'un essaie de mettre en majuscule chaque mot séparé par un espace ...

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;

Résultat

+--------------+
| name         |
+--------------+
| Abdul Karim  | 
+--------------+
Jahir islam
la source
0

Cela devrait bien fonctionner:

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

L'instruction ci-dessus peut être utilisée pour la première lettre CAPS et le reste en minuscules.

Aamir Khan
la source
-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
la source