Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我可以(应该)在同一select语句中包含TO_CHAR、CONCAT和FM元素吗?_Sql_Oracle_Select_Concatenation_Number Formatting - Fatal编程技术网

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

Sql 我可以(应该)在同一select语句中包含TO_CHAR、CONCAT和FM元素吗?,sql,oracle,select,concatenation,number-formatting,Sql,Oracle,Select,Concatenation,Number Formatting,我正在跟进上一篇文章,该文章成功地生成了OracleSELECT语句。在之前的脚本中,我现在需要 连接两个不同的字段(3位区号和7位电话号码的数值),然后 将结果列的格式设置为XXX-XXX-XXXX 但是我尝试在同一行中使用TO_CHAR,CONCAT(或|我尝试了两种方法进行串联),以及FM会导致无效的数字或无效的运算符错误(取决于我如何重新排列行中的元素)痛苦地提醒我,我刚刚入门的脚本显示出对正确使用和语法的理解严重不足 TO_CHAR和CONCAT(|)的组合成功地生成了一个9位字符

我正在跟进上一篇文章,该文章成功地生成了Oracle
SELECT
语句。在之前的脚本中,我现在需要

  • 连接两个不同的字段(3位区号和7位电话号码的数值),然后
  • 将结果列的格式设置为XXX-XXX-XXXX
但是我尝试在同一行中使用
TO_CHAR
CONCAT
(或
|
我尝试了两种方法进行串联),以及
FM
会导致无效的数字或无效的运算符错误(取决于我如何重新排列行中的元素)痛苦地提醒我,我刚刚入门的脚本显示出对正确使用和语法的理解严重不足

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

是否有人会就如何在生成的电话栏中获得所需的XXX-XXX-XXXX格式提供有用的建议?我尝试使用“fm999g999g9999”的变体,但迄今为止没有成功

谢谢


Scott

以下是我脑海中闪过的几个选项;看看,选择一个你觉得最合适的。如果你仍然有问题,发布你自己的测试用例

  • RES2是一个简单的子字符串串联,子字符串之间有一个
    -
  • RES3使用格式掩码,并对数千个NLS_数字_字符进行调整
  • RES4将区号(本身可以)与正则表达式连接起来,正则表达式将字符串分成两部分;第一部分包含
    {3}
    字符,第二部分包含
    {4}
顺便问一下,区号真的是数字吗?没有前导零



您可以发布模式(如
createtable
statement)和示例数据(如
INSERT-INTO
statements)吗?这将使我们更容易了解那里发生了什么。太棒了!感谢Littlefoot编辑我的OP和代码建议。我的具体问题是获得所需的输出格式。RES3选项导致了我在发布之前遇到的相同ORA-01722:无效数字错误(光标在连接管道之间闪烁)。然而,RES4绝对做到了。我浏览了数据,区号和电话号码都被定义为varchar2。也许最初的开发人员期望在这些字段中输入数字以外的字符?再次感谢。--斯科特
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
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>