【问题标题】:How can I format a number as xxx-xx-xxxx?如何将数字格式化为 xxx-xx-xxxx?
【发布时间】:2009-06-24 22:58:12
【问题描述】:

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

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

【问题讨论】:

  • 它是存储为 VARCHAR 还是 NUMBER。如果是后者,你如何处理前导零。

标签: oracle string-formatting to-char


【解决方案1】:

使用 TO_CHAR 格式化 SSN

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

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

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

【讨论】:

  • +1,Oracle SQL 程序员应该熟悉 Oracle 提供的格式化工具。
  • 如果 SSN 的九位数字形式有前导零,则失败。 select TO_CHAR(23456789, 'fm000g00g0000','nls_numeric_characters=.-') ssn from dual;
【解决方案2】:

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

 SUBSTR(data, 1, 3) ||'-'||SUBSTR(data, 4, 2)||'-'||SUBSTR(data, 6, 4)

【讨论】:

  • 如果数据是字符,看起来不错并且可以工作。如果是整数,则 7/8 位(即 9 位形式中以 0 开头)会转换错误
  • 我很难相信这将比 to_char 解决方案更具可读性。除此之外,如果要格式化的值是表达式的结果或函数的返回值,这不会导致冗余调用/计算吗?
【解决方案3】:

如果您想在应用格式之前检查数字是否包含 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.

问候, 抢。

【讨论】:

  • 创建演示表和正则表达式的好例子!
【解决方案4】:
CONCAT(CONCAT(CONCAT(CONCAT(SUBSTR(sspdata, 1, 3), '-'), SUBSTR(sspdata, 4, 2)), '-',) SUBSTR(sspdata, 6, 4))

【讨论】:

  • 这就是为什么我讨厌在大多数 SQL 方言中格式化内容的原因。可恶!
  • 我迟到了 4 年,但有充分的理由使用 CONCAT 而不是 || 吗?
【解决方案5】:

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

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

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

它比substr() 更优雅,并且比nls_numeric_characters 方法更紧凑(我认为更容易记住)。

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

【讨论】:

    猜你喜欢
    • 2019-08-25
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2022-10-01
    • 2013-03-19
    • 2019-04-06
    • 2020-01-06
    相关资源
    最近更新 更多