web-dev-qa-db-fra.com

MySQL - Met en majuscule la première lettre de chaque mot, dans un tableau existant

J'ai une table existante 'people_table', avec un champ full_name

De nombreux enregistrements ont le champ 'nom complet' rempli avec une casse incorrecte. par exemple. 'fred Jones' ou 'fred jones' ou 'Fred jones'.

Je peux trouver ces entrées erronées avec:

SELECT * FROM people_table WHERE full_name REGEXP BINARY '^[a-z]';

Comment puis-je mettre en majuscule la première lettre de chaque mot trouvé? par exemple. 'fred jones' devient 'Fred Jones'.

25
SirRatty

Il n’existe pas de fonction MySQL pour cela, vous devez écrire la vôtre. Dans le lien suivant, il y a une implémentation:

http://joezack.com/index.php/2008/10/20/mysql-capitalize-function/

Pour l'utiliser, vous devez d'abord créer la fonction dans la base de données. Vous pouvez le faire, par exemple, avec le navigateur de requêtes MySQL (cliquez avec le bouton droit sur le nom de la base de données et sélectionnez Créer une nouvelle fonction).

Après avoir créé la fonction, vous pouvez mettre à jour les valeurs de la table avec une requête comme celle-ci:

UPDATE users SET name = CAP_FIRST(name);
54
Vinicius Pinto

Si vous ne devez l'exécuter qu'une seule fois et que vous ne voulez pas créer de fonction, vous pouvez faire quelque chose de vraiment harcodé comme:

UPDATE people_table SET full_name = LOWER(full_name);
UPDATE people_table SET full_name = CONCAT(UPPER(SUBSTR(full_name,1,1)),LOWER(SUBSTR(full_name,2)));
UPDATE people_table SET full_name = REPLACE(full_name,' a',' A');
UPDATE people_table SET full_name = REPLACE(full_name,' b',' B');
UPDATE people_table SET full_name = REPLACE(full_name,' c',' C');
UPDATE people_table SET full_name = REPLACE(full_name,' d',' D');
UPDATE people_table SET full_name = REPLACE(full_name,' e',' E');
UPDATE people_table SET full_name = REPLACE(full_name,' f',' F');
UPDATE people_table SET full_name = REPLACE(full_name,' g',' G');
UPDATE people_table SET full_name = REPLACE(full_name,' h',' H');
UPDATE people_table SET full_name = REPLACE(full_name,' i',' I');
UPDATE people_table SET full_name = REPLACE(full_name,' j',' J');
UPDATE people_table SET full_name = REPLACE(full_name,' k',' K');
UPDATE people_table SET full_name = REPLACE(full_name,' l',' L');
UPDATE people_table SET full_name = REPLACE(full_name,' m',' M');
UPDATE people_table SET full_name = REPLACE(full_name,' n',' N');
UPDATE people_table SET full_name = REPLACE(full_name,' o',' O');
UPDATE people_table SET full_name = REPLACE(full_name,' p',' P');
UPDATE people_table SET full_name = REPLACE(full_name,' q',' Q');
UPDATE people_table SET full_name = REPLACE(full_name,' r',' R');
UPDATE people_table SET full_name = REPLACE(full_name,' s',' S');
UPDATE people_table SET full_name = REPLACE(full_name,' t',' T');
UPDATE people_table SET full_name = REPLACE(full_name,' u',' U');
UPDATE people_table SET full_name = REPLACE(full_name,' v',' V');
UPDATE people_table SET full_name = REPLACE(full_name,' w',' W');
UPDATE people_table SET full_name = REPLACE(full_name,' x',' X');
UPDATE people_table SET full_name = REPLACE(full_name,' y',' Y');
UPDATE people_table SET full_name = REPLACE(full_name,' z',' Z');
26
glerendegui

Si vous souhaitez mettre tous les mots en majuscule, vous devrez invoquer une fonction custom .

-- may help:
-- DROP function if exists capitalize;

DELIMITER $$
CREATE FUNCTION `capitalize`(s varchar(255)) RETURNS varchar(255) 
BEGIN
  declare c int;
  declare x varchar(255);
  declare y varchar(255);
  declare z varchar(255);

  set x = UPPER( SUBSTRING( s, 1, 1));
  set y = SUBSTR( s, 2);
  set c = instr( y, ' ');

  while c > 0
    do
      set z = SUBSTR( y, 1, c);
      set x = CONCAT( x, z);
      set z = UPPER( SUBSTR( y, c+1, 1));
      set x = CONCAT( x, z);
      set y = SUBSTR( y, c+2);
      set c = INSTR( y, ' ');     
  end while;
  set x = CONCAT(x, y);
  return x;
END$$

DELIMITER ;

Maintenant tu fais comme ça:

 UPDATE mytable SET thefield = capitalize(thefield);
15
Sergio Abreu

DELIMITER $$
CREATE FUNCTION `capitalize`(s varchar(255)) RETURNS varchar(255) 
BEGIN
  declare c int;
  declare x varchar(255);
  declare y varchar(255);
  declare z varchar(255);

  set x = UPPER( SUBSTRING( s, 1, 1));
  set y = lower(SUBSTR( s, 2));
  set c = instr( y, ' ');

  while c > 0
    do
      set z = SUBSTR( y, 1, c);
      set x = CONCAT( x, z);
      set z = UPPER( SUBSTR( y, c+1, 1));
      set x = CONCAT( x, z);
      set y = SUBSTR( y, c+2);
      set c = INSTR( y, ' ');     
  end while;
  set x = CONCAT(x, y);
  return x;
END$$

DELIMITER ;

Create above function to set First character to capital of each words

4
Vijay Chauhan

J'ai essayé le code ci-dessus mais des erreurs de syntaxe ont été détectées sur la fonction. Je ne pouvais donc pas le créer. A écrit ceci pour la dernière version de MySQL s'il aide quelqu'un

CREATE FUNCTION  `CAP_FIRST`(input VARCHAR(255)) RETURNS varchar(255) CHARSET latin1
    DETERMINISTIC
BEGIN
    DECLARE len INT;
    DECLARE i INT;
    DECLARE charnum INT;
    declare SortedName varchar(255);

    SET len   = CHAR_LENGTH(input);
    SET input = LOWER(input);
    SET i = 1;
    set charnum = 1;
    set SortedName = '';


    WHILE (i <= len) DO
        if charnum = 1 then
            set SortedName = concat(SortedName,upper(mid(input,i,1)));
            set charnum = charnum + 1;
        else
            if mid(input,i,1) = ' ' then
                set SortedName = concat(SortedName,' ');
                set charnum = 1;
            else
                set SortedName = concat(SortedName,mid(input,i,1));
                set charnum = charnum + 1;
            end if;

        end if;


        SET i = i + 1;
    END WHILE;

    RETURN SortedName;
END

Voici deux fonctions utiles de Nicholas Thompson. Vous pouvez définir la 3ème variable de UC_DELEMITER sur false et la seconde sur "" pour la capitalisation de plusieurs mots.

UC_FIRST Majuscule une chaîne donnée - Cette fonction est un clone de la fonction ucfirst en PHP.

DROP FUNCTION IF EXISTS UC_FIRST;
CREATE FUNCTION UC_FIRST(oldWord VARCHAR(255)) RETURNS VARCHAR(255)
RETURN CONCAT(UCASE(SUBSTRING(oldWord, 1, 1)),SUBSTRING(oldWord, 2));

UC_DELIMITER Capitaliser avec un délimiteur entre les mots

DROP FUNCTION IF EXISTS UC_DELIMITER;
DELIMITER //
CREATE FUNCTION UC_DELIMITER(
   oldName VARCHAR(255), delim VARCHAR(1), trimSpaces BOOL
) 
  RETURNS VARCHAR(255)
BEGIN
SET @oldString := oldName;
SET @newString := "";

tokenLoop: LOOP
    IF trimSpaces THEN SET @oldString := TRIM(BOTH " " FROM @oldString);          END IF;

SET @splitPoint := LOCATE(delim, @oldString);

IF @splitPoint = 0 THEN
  SET @newString := CONCAT(@newString, UC_FIRST(@oldString));
  LEAVE tokenLoop;
END IF;

   SET @newString := CONCAT(@newString, UC_FIRST(SUBSTRING(@oldString, 1, @splitPoint)));
   SET @oldString := SUBSTRING(@oldString, @splitPoint+1);
END LOOP tokenLoop;

RETURN @newString;
END//
DELIMITER ;

Exemples:

SELECT UC_DELIMITER('eric-leroy','-',TRUE);
Eric-Leroy  

Page Web de la fonction

3
Eric Leroy

Si vous utilisez PHP, alors ...

try{
  $con = new PDO("mysql:Host=localhost;dbname=dbasename", "root", "");
}
catch(PDOException $e){
  echo "error" . $e-getMessage();
}

$select = $con->prepare("SELECT * FROM table");
$select->setFetchMode(PDO::FETCH_ASSOC);
$select->execute();

while($data=$select->fetch()) {

  $id = $data['id'];
  $column = $data['column'];
  $column = ucwords(strtolower($column)); // Capitalize each Word

  $update = $con->prepare("UPDATE table SET column=:column WHERE id='$id'");
  $update->bindParam(':column', $column);
  $update->execute();
}
0
user7796548

Simplement:

SELECT
CONCAT(UCASE(LEFT(firstname, 1)), LCASE(SUBSTRING(firstname, 2))) as firstname
FROM PEOPLE
0
Thomas

Le Propre fonction dans Excel (ou Google feuilles fait exactement ce que vous voulez.

Exportez donc votre table mysql en tant que CSV et dans Excel (ou feuilles de Google). Puis utilisez = Proper(*text_to_capitalize*) pour mettre en majuscule la première lettre de chaque mot. 

Exportez ensuite cette feuille Excel au format CSV dans votre base de données.

0
Matt C.