Вопрос по mysql – Маскировка вывода MySQL (т. Е. Номер телефона, SSN и т. Д. Форматирование экрана)

6

Есть ли встроенная функция SQL, которая будет маскировать выходные данные?

Допустим, у меня есть целочисленный столбец, который представляет номер телефона (для любой страны). Есть ли лучший способ отобразить числа, чем разделять их на части, загружая хэши, тире и точки, а затем объединяя их вместе?

Я знаю, что на нескольких языках есть возможность просто маскировать данные, отображаемые вместо их реструктуризации. Есть ли в MySQL что-то похожее?

Ваш Ответ

3   ответа
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,'###-#!##@(###)') |
+----------------------------------+
| [email protected](789)                   |
+----------------------------------+
1 row in set (0.00 sec)
Это было здорово, я использовал для простого форматирования вывода. большое спасибо
1

http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format

Но вы также почти ответили на свой вопрос. MySQL не обладает такой же мощностью, чтобы можно было легко писать средство форматирования на основе других критериев. Это можно сделать с помощью операторов if, но логика затрудняет чтение SQL в лучшем случае. Таким образом, если вы пытаетесь создать, например, средство форматирования, основанное на коде страны, вам придется вложить много логики в оператор SQL, что для него не лучшее место, если у вас есть возможность выбора другого языка для разбирать результаты.

3

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 ()) использует имя поля для первой позиции, символьную позицию для второй и количество цифр для третьей. Использование & quot; AS Phone & quot; поддерживает чистоту заголовка вашего столбца в выводе запроса.

One note of caution: I'd recommend against using integers for phone numbers, social security numbers, etc. The reason is that you'll probably never perform numeric computations with these numbers. While there is the odd chance you'd use them as a promary key, there's always the possibility of losing digits from numbers with leading zeros.

Похожие вопросы