I adapted @Mahesh's answer for what I was trying to accomplish (personal preferences):
- make the first character uppercase
- make the
-
and _
characters spaces
- handle abbreviations
- replace minor words with lowercase
Here's a comparison of the two.
Mine:
SELECT camelCaseToSpaced('iWasUsingThisForSetting-name-conversionForTheACMECo_project');
outputs...
I Was Using This for Setting name conversion for the ACME Co project
Mahesh's version
SELECT camelCaseToSpacedMahesh('iWasUsingThisForSetting-name-conversionForTheACMECo_project');
outputs...
i Was Using This For Settingnameconversion For The A C M E Coproject
So here's my code:
CREATE FUNCTION camelCaseToSpaced(string VARCHAR(100)) RETURNS VARCHAR(255)
BEGIN
SET @text = string;
SET @result = "";
SET @i = 1;
SET @caps = 0;
WHILE @i <= LENGTH(@text) DO
SET @t = SUBSTRING(@text, @i, 1);
SET @lastCaps = @caps;
SET @caps = 0;
-- uppers or _ or -
IF @i > 1 AND ASCII(SUBSTRING(@text, @i, 1)) BETWEEN 65 AND 90 OR @t ='_' OR @t = '-' THEN
IF NOT (@t ='_' OR @t = '-') THEN
set @caps = 1;
ELSE
set @caps = 0;
END IF;
IF @i < LENGTH(@text) THEN
set @nextAscii = ASCII(SUBSTRING(@text, @i+1, 1));
END IF;
SET @sep = ' ';
-- to not have no space separator we need:
-- 1. previous char is cap
-- 2. next ascii is cap
IF (@lastCaps = 1 AND @nextAscii BETWEEN 65 AND 90) THEN
SET @sep = '';
END IF;
SET @result = CONCAT(@result, @sep);
END IF;
-- all characters except _ and -
IF @t <> '_' AND @t <> '-' THEN
-- make first character uppercase
IF @i = 1 THEN
SET @t = UPPER(@t);
END IF;
SET @result = CONCAT(@result , @t);
end IF;
SET @i = @i + 1;
END WHILE;
SET @result = replace(@result, ' The ', ' the ');
SET @result = replace(@result, ' As ', ' as ');
SET @result = replace(@result, ' In ', ' in ');
SET @result = replace(@result, ' To ', ' to ');
SET @result = replace(@result, ' On ', ' on ');
SET @result = replace(@result, ' Of ', ' of ');
SET @result = replace(@result, ' For ', ' for ');
RETURN @result;
END;