8

我正在从存储过程中查询社会安全号码数据,我想在我的存储过程中将其格式化为社会安全号码。

如何在 Oracle 中像 xxx-xx-xxxx 一样格式化 xxxxxxxxx?

4

5 回答 5

18

使用 TO_CHAR 格式化 SSN

SELECT TO_CHAR(012345678, '000g00g0000','nls_numeric_characters=.-') ssn from dual;

SSN
-----------
012-34-5678  

更新:感谢 Gary 指出应该使用“0”格式字符而不是“9”来保留前导零。

于 2009-06-25T03:38:35.583 回答
11

您还可以使用 concat 运算符||,它可能更具可读性。

 SUBSTR(data, 1, 3) ||'-'||SUBSTR(data, 4, 2)||'-'||SUBSTR(data, 6, 4)
于 2009-06-24T23:20:26.087 回答
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.

问候,罗布。

于 2009-06-25T09:09:38.407 回答
0
CONCAT(CONCAT(CONCAT(CONCAT(SUBSTR(sspdata, 1, 3), '-'), SUBSTR(sspdata, 4, 2)), '-',) SUBSTR(sspdata, 6, 4))
于 2009-06-24T23:03:29.100 回答
0

我只迟到了 11 年,但几个月前我提出了这个问题,刚刚想出了我新的首选方法:

replace(to_char(my_number, 'FM000,00,0000'), ',', '-')

FM修剪前导空格,并将这些replace()逗号变成破折号。一个警告:这只适用于数字(这在我们的用例中很好)。

它比方法更优雅substr(),更紧凑(在我​​看来,更容易记住)nls_numeric_characters

也就是说,我认为这种方法效率低于该nls_numeric_characters方法。

于 2020-07-24T18:56:37.883 回答