Sql 我可以(应该)在同一select语句中包含TO_CHAR、CONCAT和FM元素吗?
我正在跟进上一篇文章,该文章成功地生成了OracleSql 我可以(应该)在同一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位字符
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>