我正在查询存储过程中的社会安全号码数据,我想将其格式化为存储过程中的社会安全号码。
如何在Oracle中格式化像xxx-xx-xxxx这样的xxxxxxxxx?
答案 0 :(得分:18)
使用TO_CHAR进行SSN格式化
SELECT TO_CHAR(012345678, '000g00g0000','nls_numeric_characters=.-') ssn from dual;
SSN
-----------
012-34-5678
更新:感谢Gary指出应该使用'0'格式字符而不是'9'来保留前导零。
答案 1 :(得分:11)
你也可以使用concat运算符||
,它可能更具可读性。
SUBSTR(data, 1, 3) ||'-'||SUBSTR(data, 4, 2)||'-'||SUBSTR(data, 6, 4)
答案 2 :(得分:6)
如果您想在应用格式之前检查数字是否包含9位数,那么正则表达式可能会有所帮助:
SQL> create table t (nr)
2 as
3 select 123456789 from dual union all
4 select 987654321 from dual union all
5 select null from dual union all
6 select 1234567 from dual union all
7 select 12345678901234 from dual
8 /
Tabel is aangemaakt.
SQL> select nr
2 , regexp_replace(nr,'(^[[:digit:]]{3})([[:digit:]]{2})([[:digit:]]{4}$)','\1-\2-\3') formatted_nr
3 from t
4 /
NR FORMATTED_NR
-------------------------------------- --------------------
123456789 123-45-6789
987654321 987-65-4321
1234567 1234567
12345678901234 12345678901234
5 rijen zijn geselecteerd.
此致 罗布。
答案 3 :(得分:0)
CONCAT(CONCAT(CONCAT(CONCAT(SUBSTR(sspdata, 1, 3), '-'), SUBSTR(sspdata, 4, 2)), '-',) SUBSTR(sspdata, 6, 4))
答案 4 :(得分:0)
我只迟了11年,但几个月前我才问了这个问题,并想出了我的新首选方法:
replace(to_char(my_number, 'FM000,00,0000'), ',', '-')
FM
会修饰前导空格,而replace()
会将那些逗号变成破折号。一个警告:仅适用于数字(在我们的用例中很好)。
它比substr()
更优雅,比nls_numeric_characters
方法更紧凑(我认为更容易记住)。
也就是说,我认为此方法的效率不如nls_numeric_characters
方法。