8
votes

Comment puis-je atteindre la fonctionnalité initcap dans MySQL?

J'ai besoin de la fonctionnalité de initcap pour les noms de la région. Y a-t-il un moyen de réaliser cela dans MySQL?

  • Afrique
  • Inde Sous-continent
  • u.s. Côte ouest
  • europe / u.k

    De cette façon, les résultats peuvent être?


1 commentaires

Voir les commentaires sur le page de documentation pour les fonctions de chaîne .


4 Réponses :


15
votes

En retour, je cherchais une fonction initcap / ucfirst intégrée dans MySQL, mais je n'ai malheureusement pas pu trouver de telles fonctions de chaîne, alors décidé d'écrire le ma propre .. Grâce au membre de la communauté mysql, a corrigé le bogue dans ma fonction et posté le retour.

DELIMITER $$

DROP FUNCTION IF EXISTS `test`.`initcap`$$

CREATE FUNCTION `initcap`(x char(30)) RETURNS char(30) CHARSET utf8
READS SQL DATA
DETERMINISTIC
BEGIN
SET @str='';
SET @l_str='';
WHILE x REGEXP ' ' DO
SELECT SUBSTRING_INDEX(x, ' ', 1) INTO @l_str;
SELECT SUBSTRING(x, LOCATE(' ', x)+1) INTO x;
SELECT CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(@l_str,1,1)),LOWER(SUBSTRING(@l_str,2)))) INTO @str;
END WHILE;
RETURN LTRIM(CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2)))));
END$$

DELIMITER ;


Usage: 

select initcap('This is test string');


1 commentaires

Avertissement! Cette fonction a détruit ma base de données. Je n'ai pas remarqué que le "retour" était une simple chaîne de 30 caractères. Toutes les descriptions de ma table venaient d'être tronquées à 30 caractères.



1
votes
DELIMITER $$

DROP FUNCTION IF EXISTS `test`.`initcap`$$

CREATE FUNCTION `initcap`(x char(30)) RETURNS char(30) CHARSET utf8
BEGIN
SET @str='';
SET @l_str='';
WHILE x REGEXP ' ' DO
SELECT SUBSTRING_INDEX(x, ' ', 1) INTO @l_str;
SELECT SUBSTRING(x, LOCATE(' ', x)+1) INTO x;
SELECT CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(@l_str,1,1)),LOWER(SUBSTRING(@l_str,2)))) INTO @str;
END WHILE;
RETURN LTRIM(CONCAT(@str, ' ', CONCAT(UPPER(SUBSTRING(x,1,1)),LOWER(SUBSTRING(x,2)))));
END$$

DELIMITER ;

0 commentaires

1
votes
CREATE FUNCTION `upperfirst`(x varchar(255)) RETURNS varchar(255) CHARSET latin1

RETURN concat( upper(substring(x,1,1)),lower(substring(x,2)) );

1 commentaires

Veuillez clarifier votre réponse.



2
votes
DELIMITER $$

CREATE
   FUNCTION `test`.`initcap`(input VARCHAR(255))
   RETURNS VARCHAR(255) 
BEGIN
DECLARE len INT;
DECLARE i INT;

SET len   = CHAR_LENGTH(input);
SET input = LOWER(input);
SET i = 0;

WHILE (i < len) DO
    IF (MID(input,i,1) = ' ' OR i = 0) THEN
        IF (i < len) THEN
            SET input = CONCAT(
                LEFT(input,i),
                UPPER(MID(input,i + 1,1)),
                RIGHT(input,len - i - 1)
            );
        END IF;
    END IF;
    SET i = i + 1;
END WHILE;

RETURN input;
END$$

DELIMITER ;
usage:  initcap("hello world")
output:  Hello Worldusage:  initcap("HELLO WORLD")
output: Hello WorldThis converts first letter of each word in the string to capital.

1 commentaires

Les solutions mentionnées précédemment à cela étaient simplement convertissant la première lettre de la chaîne. Mais celui-ci convertit la première lettre de chaque mot de la chaîne en majuscule.