2012-04-11 12 views
4

出力データをマスクする組み込みSQL関数はありますか?MySQL出力マスキング(電話番号、SSNなどの表示形式)

私は、(すべての国の)電話番号を表す整数列を持っているとします。サブストリングを分割したり、ハッシュ、ダッシュ、ドットを読み込んだり、連結したりするよりも、数字を表示する方がいいですか?

私は、いくつかの言語が、データを再構成する代わりに表示されるように単純にマスクする機能を持っていることを知っています。 MySQLには似たものがありますか?

答えて

14

ここで私が思いついたのは、修正や改善があればコメントとして残してください。コードを更新します。そうでなければ、あなたが好きならば、それにぶつからないでください。楽しい!

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 ; 

はここでそれを使用する方法です...それは唯一のあなたのPeople表はnamelastnamefirst、およびphoneのフィールドを持っているとしましょう(すなわち、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,'###-#!##@(###)') | 
+----------------------------------+ 
| [email protected](789)     | 
+----------------------------------+ 
1 row in set (0.00 sec) 
+1

これは素晴らしかった、私は単純なformating出力のために使用しました。どうもありがとう –

1

はい、MySQLは電源をフォーマットしているん: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format

をしかし、あなたはまた、ほとんどあなた自身の質問に答えました。 MySQLは、他の基準に基づいてフォーマッタを簡単に書くことができるように、同じ電力量を持っていません。これは、if文でも可能ですが、ロジックによってSQLを最高で読みにくくします。たとえば、国コードに基づいたフォーマッタを使用しようとしていた場合、別の言語のオプションがある場合は、SQLステートメントに多くのロジックを書き込む必要があります。結果を解析します。

3

整数に対して動作します。

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電話"を使用すると、クエリの出力に列見出しがきれいになります。

メモ:電話番号、社会保障番号などに整数を使用することをお勧めします。これらの数字で数値計算を行うことはおそらくないためです。あなたがそれらをプロミネントキーとして使用する奇妙な機会がありますが、先行ゼロを持つ数字から数字を失う可能性は常にあります。

関連する問題