2012-04-11 109 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 ; 

下面是如何使用它...它僅適用於整數(即SSN博士#等)

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

這很好,我用於一個簡單的格式輸出。非常感謝 – 2013-06-27 02:53:51

1

是,MySQL的有格式功率: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format

但是你也幾乎回答了你自己的問題。 MySQL沒有相同數量的功能來根據其他標準輕鬆編寫格式化程序。它可以與if語句一起使用,但是邏輯使SQL很難閱讀。因此,例如,如果您嘗試使用基於國家/地區代碼的格式化程序,則必須在SQL語句中寫入大量邏輯,但這不是最適合它的地方,如果您可以選擇另一種語言解析結果。

3

比方說,你People表有namelastnamefirst,並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電話」將您的列標題保留在查詢輸出中。

請注意一點:我建議不要在電話號碼,社會安全號碼等中使用整數。原因是您可能不會使用這些數字執行數字計算。雖然你有很大的機會將它們用作主鍵,但總是有可能從具有前導零的數字中丟失數字。