是否有内置的 SQL 函数可以屏蔽输出数据?
假设我有一个整数列,它代表一个电话号码(对于任何国家)。有没有比将它们分开、加载散列、破折号和点,然后将它们重新连接在一起更好的方法来显示数字?
我知道几种语言都有一个功能,可以在显示数据时简单地屏蔽数据,而不是对其进行重组。MySQL有类似的东西吗?
是否有内置的 SQL 函数可以屏蔽输出数据?
假设我有一个整数列,它代表一个电话号码(对于任何国家)。有没有比将它们分开、加载散列、破折号和点,然后将它们重新连接在一起更好的方法来显示数字?
我知道几种语言都有一个功能,可以在显示数据时简单地屏蔽数据,而不是对其进行重组。MySQL有类似的东西吗?
这是我想出的,如果您有任何修改或改进,请留下评论,我会更新代码。否则,如果您喜欢它,请不要碰它。享受!
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)
假设您的People
表有namelast
、namefirst
和phone
字段。
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”可以使查询输出中的列标题保持整洁。
需要注意的一点:我建议不要对电话号码、社会保险号码等使用整数。原因是您可能永远不会使用这些数字进行数值计算。虽然您有可能将它们用作主键,但总是有可能丢失带有前导零的数字的数字。
是的,mySQL 确实具有格式化功能: http ://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format
但你也几乎回答了你自己的问题。MySQL 没有相同的能力来轻松编写基于其他标准的格式化程序。它可以,使用 if 语句,但逻辑最多使 SQL 难以阅读。因此,例如,如果您尝试使用基于国家/地区代码的格式化程序,则必须在 SQL 语句中写入大量逻辑,如果您可以选择另一种语言解析结果。