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

Can (should) I include elements of TO_CHAR, CONCAT and FM in the same select statement?

我正在跟进之前成功生成 Oracle SELECT 语句的 post。在之前的脚本中,我现在需要

但我尝试在同一行中使用 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

是否有人可以就在结果 Phone 列中获得所需的 XXX-XXX-XXXX 格式提供有用的建议?到目前为止,我对 'fm999g999g9999' 变体的尝试还没有成功。

谢谢,

斯科特

以下是我想到的几个选项;看看,选择你认为最合适的。如果还有问题,post自己的测试用例。

  • RES2 是在
  • 之间具有 - 的子字符串的简单串联
  • RES3 使用格式掩码调整 NLS_NUMERIC_CHARACTERS thousands
  • 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})', '-') 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>