MySQL输出屏蔽(即电话号码,SSN等显示格式)

时间:2012-04-11 19:36:16

标签: mysql

是否有内置的SQL函数可以屏蔽输出数据?

假设我有一个整数列,代表一个电话号码(对于任何国家/地区)。是否有更好的方法来显示数字而不是将它们分开,加载哈希,破折号和点,然后将它们连接在一起?

我知道有几种语言可以简单地屏蔽数据,而不是重构数据。 MySQL有类似的东西吗?

3 个答案:

答案 0 :(得分:17)

这是我想出的,如果您有任何修改或改进,请将它们留作评论,我会更新代码。否则,如果你喜欢它,不要让它碰到它。享受!

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 ;

以下是如何使用它...它只适用于整数(即SSN Ph#等)

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,'###-#!##@(###)') |
+----------------------------------+
| 123-4!56@(789)                   |
+----------------------------------+
1 row in set (0.00 sec)

答案 1 :(得分:3)

我们假设您的People表格包含namelastnamefirstphone字段。

SELECT p.namelast, p.namefirst,     
  CONCAT(SUBSTR(p.phone,1,3), '-', SUBSTR(p.phone,4,3), '-', SUBSTR(p.phone,7,4)) AS Telephone, 
FROM People p

CONCAT(SUBSTR())使用第一个位置的字段名称,第二个位置的字符位置和第三个位置的位数。使用" AS Telephone"在查询输出中保持列标题清晰。

需要注意的一点是:我建议不要将整数用于电话号码,社会安全号码等。原因是您可能永远不会使用这些号码进行数值计算。虽然您很有可能将它们用作主键,但总有可能丢失带有前导零的数字的数字。

答案 2 :(得分:1)

是的,mySQL确实具有格式化功能: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format

但你几乎已经回答了自己的问题。 MySQL没有相同的功率,无法根据其他标准轻松编写格式化程序。它可以使用if语句,但逻辑使得SQL最多难以阅读。因此,如果您尝试使用基于国家/地区代码的格式化程序,例如,如果您可以选择使用其他语言,则必须在SQL语句中编写大量逻辑,而不是最佳位置。解析结果。