Is there a simple way to convert MySQL data into Title Case? Is there a simple way to convert MySQL data into Title Case? mysql mysql

Is there a simple way to convert MySQL data into Title Case?


Edit

Eureka! Literally my first SQL function. No warranty offered. Back up your data before using. :)

First, define the following function:

DROP FUNCTION IF EXISTS lowerword;SET GLOBAL  log_bin_trust_function_creators=TRUE; DELIMITER |CREATE FUNCTION lowerword( str VARCHAR(128), word VARCHAR(5) )RETURNS VARCHAR(128)DETERMINISTICBEGIN  DECLARE i INT DEFAULT 1;  DECLARE loc INT;  SET loc = LOCATE(CONCAT(word,' '), str, 2);  IF loc > 1 THEN    WHILE i <= LENGTH (str) AND loc <> 0 DO      SET str = INSERT(str,loc,LENGTH(word),LCASE(word));      SET i = loc+LENGTH(word);      SET loc = LOCATE(CONCAT(word,' '), str, i);    END WHILE;  END IF;  RETURN str;END;|DELIMITER ;

This will lower all occurrences of word in str.

Then define this modified proper function:

DROP FUNCTION IF EXISTS tcase; SET GLOBAL  log_bin_trust_function_creators=TRUE; DELIMITER | CREATE FUNCTION tcase( str VARCHAR(128) ) RETURNS VARCHAR(128)DETERMINISTICBEGIN   DECLARE c CHAR(1);   DECLARE s VARCHAR(128);   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;  SET s = lowerword(s, 'A');  SET s = lowerword(s, 'An');  SET s = lowerword(s, 'And');  SET s = lowerword(s, 'As');  SET s = lowerword(s, 'At');  SET s = lowerword(s, 'But');  SET s = lowerword(s, 'By');  SET s = lowerword(s, 'For');  SET s = lowerword(s, 'If');  SET s = lowerword(s, 'In');  SET s = lowerword(s, 'Of');  SET s = lowerword(s, 'On');  SET s = lowerword(s, 'Or');  SET s = lowerword(s, 'The');  SET s = lowerword(s, 'To');  SET s = lowerword(s, 'Via');  RETURN s; END; | DELIMITER ; 

Usage

Verify it works as expected:

SELECT tcase(title) FROM table;

Use it:

UPDATE table SET title = tcase(title);

Source: http://www.artfulsoftware.com/infotree/queries.php?&bw=1070#122


umm something like this may work

UPDATE table_name SET `col_name`= CONCAT( UPPER( SUBSTRING( `col_name`, 1, 1 ) ) , LOWER( SUBSTRING( `col_name` FROM 2 ) ) );


If you need to throw custom acronyms and other custom capitalisation patterns into the mix I've generalised hobodave's answer:

DELIMITER |CREATE FUNCTION replaceword( str VARCHAR(128), word VARCHAR(128) )RETURNS VARCHAR(128)DETERMINISTICBEGIN  DECLARE loc INT;  DECLARE punct CHAR(27) DEFAULT ' ()[]{},.-_!@;:?/''"#$%^&*<>';   DECLARE lowerWord VARCHAR(128);  DECLARE lowerStr VARCHAR(128);  IF LENGTH(word) = 0 THEN    RETURN str;  END IF;  SET lowerWord = LOWER(word);  SET lowerStr = LOWER(str);  SET loc = LOCATE(lowerWord, lowerStr, 1);  WHILE loc > 0 DO    IF loc = 1 OR LOCATE(SUBSTRING(str, loc-1, 1), punct) > 0 THEN      IF loc+LENGTH(word) > LENGTH(str) OR LOCATE(SUBSTRING(str, loc+LENGTH(word), 1), punct) > 0 THEN        SET str = INSERT(str,loc,LENGTH(word),word);      END IF;    END IF;    SET loc = LOCATE(lowerWord, lowerStr, loc+LENGTH(word));  END WHILE;  RETURN str;END;|DELIMITER ;DELIMITER | CREATE FUNCTION tcase( str VARCHAR(128) ) RETURNS VARCHAR(128)DETERMINISTICBEGIN   DECLARE c CHAR(1);   DECLARE s VARCHAR(128);   DECLARE i INT DEFAULT 1;   DECLARE bool INT DEFAULT 1;   DECLARE punct CHAR(27) 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;  SET s = replaceword(s, 'a');  SET s = replaceword(s, 'an');  SET s = replaceword(s, 'and');  SET s = replaceword(s, 'as');  SET s = replaceword(s, 'at');  SET s = replaceword(s, 'but');  SET s = replaceword(s, 'by');  SET s = replaceword(s, 'for');  SET s = replaceword(s, 'if');  SET s = replaceword(s, 'in');  SET s = replaceword(s, 'n');  SET s = replaceword(s, 'of');  SET s = replaceword(s, 'on');  SET s = replaceword(s, 'or');  SET s = replaceword(s, 'the');  SET s = replaceword(s, 'to');  SET s = replaceword(s, 'via');  SET s = replaceword(s, 'RSS');  SET s = replaceword(s, 'URL');  SET s = replaceword(s, 'PHP');  SET s = replaceword(s, 'SQL');  SET s = replaceword(s, 'OPML');  SET s = replaceword(s, 'DHTML');  SET s = replaceword(s, 'CSV');  SET s = replaceword(s, 'iCal');  SET s = replaceword(s, 'XML');  SET s = replaceword(s, 'PDF');  SET c = SUBSTRING( s, 1, 1 );   IF c >= 'a' AND c <= 'z' THEN        SET s = CONCAT(UCASE(c),SUBSTRING(s,2));   END IF;   RETURN s; END; | DELIMITER ;

Essentially it consists of a case-insensitive word replace function and a function to capitalise the first letter of every word and perform some transforms for specific words.

Hope its helpful to someone.