出力データをマスクする組み込み 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())
、最初の位置にフィールド名、2 番目に文字位置、3 番目に桁数を使用します。「AS Telephone」を使用すると、クエリ出力の列見出しがきれいに保たれます。
1 つの注意点: 電話番号、社会保障番号などに整数を使用しないことをお勧めします。理由は、これらの番号を使用して数値計算を実行することはおそらくないからです。それらを主キーとして使用する可能性はまれにありますが、先頭にゼロがある数字から桁が失われる可能性は常にあります。
はい、mySQL にはフォーマット機能があります: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format
しかし、あなたは自分の質問にもほぼ答えています。MySQL には、他の基準に基づいてフォーマッタを簡単に作成できるほどの能力はありません。if ステートメントを使用することはできますが、そのロジックにより、せいぜい SQL が読みにくくなります。したがって、たとえば、国コードに基づいたフォーマッタを使用しようとしている場合、別の言語のオプションがある場合、SQL ステートメントに多くのロジックを書き込む必要がありますが、これは最適な場所ではありません。結果を解析します。