Aqui está o que eu criei, se você tiver alguma modificação ou melhoria, por favor, deixe-a como comentários e eu atualizarei o código. Caso contrário, se você gosta dele, não tente bater nele. Aproveitar!
DELIMITER //
CREATE FUNCTION mask (unformatted_value BIGINT, format_string CHAR(32))
RETURNS CHAR(32) DETERMINISTIC
BEGIN
# Declare variables
DECLARE input_len TINYINT;
DECLARE output_len TINYINT;
DECLARE temp_char CHAR;
# Initialize variables
SET input_len = LENGTH(unformatted_value);
SET output_len = LENGTH(format_string);
# Construct formated string
WHILE ( output_len > 0 ) DO
SET temp_char = SUBSTR(format_string, output_len, 1);
IF ( temp_char = '#' ) THEN
IF ( input_len > 0 ) THEN
SET format_string = INSERT(format_string, output_len, 1, SUBSTR(unformatted_value, input_len, 1));
SET input_len = input_len - 1;
ELSE
SET format_string = INSERT(format_string, output_len, 1, '0');
END IF;
END IF;
SET output_len = output_len - 1;
END WHILE;
RETURN format_string;
END //
DELIMITER ;
Veja como usá-lo... Funciona apenas para números inteiros (ou seja, SSN Ph# etc.)
mysql> select mask(123456789,'###-##-####');
+-------------------------------+
| mask(123456789,'###-##-####') |
+-------------------------------+
| 123-45-6789 |
+-------------------------------+
1 row in set (0.00 sec)
mysql> select mask(123456789,'(###) ###-####');
+----------------------------------+
| mask(123456789,'(###) ###-####') |
+----------------------------------+
| (012) 345-6789 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select mask(123456789,'###-#!##@(###)');
+----------------------------------+
| mask(123456789,'###-#!##@(###)') |
+----------------------------------+
| [email protected](789) |
+----------------------------------+
1 row in set (0.00 sec)