是否有內置的SQL函數將屏蔽輸出數據?MySQL輸出掩碼(即電話號碼,SSN等顯示格式)
比方說,我有一個整數列,表示一個電話號碼(對於任何國家)。有沒有更好的方法來顯示數字,而不是將它們分開,加載散列,破折號和點,然後將它們連接在一起?
我知道幾種語言有一個功能,只是屏蔽顯示數據,而不是重構它。 MySQL有類似的東西嗎?
是否有內置的SQL函數將屏蔽輸出數據?MySQL輸出掩碼(即電話號碼,SSN等顯示格式)
比方說,我有一個整數列,表示一個電話號碼(對於任何國家)。有沒有更好的方法來顯示數字,而不是將它們分開,加載散列,破折號和點,然後將它們連接在一起?
我知道幾種語言有一個功能,只是屏蔽顯示數據,而不是重構它。 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博士#等)
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)
是,MySQL的有格式功率: http://dev.mysql.com/doc/refman/5.1/en/string-functions.html#function_format
但是你也幾乎回答了你自己的問題。 MySQL沒有相同數量的功能來根據其他標準輕鬆編寫格式化程序。它可以與if語句一起使用,但是邏輯使SQL很難閱讀。因此,例如,如果您嘗試使用基於國家/地區代碼的格式化程序,則必須在SQL語句中寫入大量邏輯,但這不是最適合它的地方,如果您可以選擇另一種語言解析結果。
比方說,你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電話」將您的列標題保留在查詢輸出中。
請注意一點:我建議不要在電話號碼,社會安全號碼等中使用整數。原因是您可能不會使用這些數字執行數字計算。雖然你有很大的機會將它們用作主鍵,但總是有可能從具有前導零的數字中丟失數字。
這很好,我用於一個簡單的格式輸出。非常感謝 – 2013-06-27 02:53:51