我可以(应该)在同一条select语句中包含TO_CHAR,CONCAT和FM的元素吗?

时间:2018-07-31 20:10:37

标签: sql oracle select number-formatting

我正在跟踪上一篇成功生成Oracle SELECT语句的文章。从先前的脚本中,我现在需要

  • 连接两个不同的字段(3位区号和7位电话号码的数字值),然后
  • 将结果列的格式设置为XXX-XXX-XXXX

,但是我尝试使用TO_CHARCONCAT(或||尝试同时进行串联)和FM在同一行中导致无效数字或无效的运算符错误(取决于我如何重新排列行中的元素)令人痛苦地提醒我,我的基本脚本几乎不了解正确的用法和语法。

TO_CHARCONCAT||)的组合成功生成了一个9位数的字符串,但是我试图从格式为XXX-XXX-XXXX的结果中获得接下来的内容(我已经从原始脚本中删除了与该特定问题无关的数据元素的行;原始查询中没有嵌套任何内容,它只选择了几个字段,并有一系列左联接连接到一个通用UID字段,不同的表)

select distinct
  cn.dflt_id StudentIdNumber,
  to_char (p.area_code || p.phone_no) Phone,
from
  co_name cn
  left join co_v_name_phone1 p on cn.name_id = p.name_id
order by cn.dflt_id

在获得的“电话”列中,是否有人会提供有用的建议以实现所需的XXX-XXX-XXXX格式?到目前为止,我对'fm999g999g9999'变体的尝试均未成功。

谢谢

斯科特

1 个答案:

答案 0 :(得分:0)

以下是我想到的一些选择;看一看,选择最合适的那个。如果仍然有问题,请发布自己的测试用例。

  • RES2是子字符串的简单串联,子字符串之间有一个-
  • RES3将格式掩码和调整后的NLS_NUMERIC_CHARACTERS用于
  • RES4用正则表达式将区号(本身可以确定)连接起来,该正则表达式将字符串分成两部分;第一个具有{3}个字符,第二个具有{4}个字符

顺便说一句,区号真的是数字吗?没有前导零?


SQL> with test (area_code, phone_number) as
  2    (select 123, 9884556 from dual union
  3     select 324, 1254789 from dual
  4    )
  5  select
  6    to_char(area_code) || to_char(phone_number) l_concat,
  7    --
  8    substr(to_char(area_code) || to_char(phone_number), 1, 3) ||'-'||
  9    substr(to_char(area_code) || to_char(phone_number), 4, 3) ||'-'||
 10    substr(to_char(area_code) || to_char(phone_number), 7)
 11    res2,
 12    --
 13    to_char(to_char(area_code) || to_char(phone_number),
 14            '000g000g0000', 'nls_numeric_characters=.-') res3,
 15    --
 16    to_char(area_code) ||'-'||
 17    regexp_replace(to_char(phone_number), '(\d{3})(\d{4})', '\1-\2') res4
 18  from test;

L_CONCAT      RES2          RES3          RES4
------------- ------------- ------------- -------------
1239884556    123-988-4556   123-988-4556 123-988-4556
3241254789    324-125-4789   324-125-4789 324-125-4789

SQL>