我可以(应该)在同一个 select 语句中包含 TO_CHAR、CONCAT 和 FM 的元素吗?
Can (should) I include elements of TO_CHAR, CONCAT and FM in the same select statement?
我正在跟进之前成功生成 Oracle SELECT
语句的 post。在之前的脚本中,我现在需要
- 连接两个不同的字段(3 位区号和 7 位 phone 号码的数值),然后
- 将结果列的格式设置为 XXX-XXX-XXXX
但我尝试在同一行中使用 TO_CHAR
、CONCAT
(或 ||
我尝试过两种方式进行串联)和 FM
结果无效的数字或无效的运算符错误(取决于我如何重新排列行中的元素)痛苦地提醒我,我勉强基本的脚本显示严重缺乏对正确使用和语法的理解。
TO_CHAR
和 CONCAT
(||
) 的组合成功生成了一个 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>
我正在跟进之前成功生成 Oracle SELECT
语句的 post。在之前的脚本中,我现在需要
- 连接两个不同的字段(3 位区号和 7 位 phone 号码的数值),然后
- 将结果列的格式设置为 XXX-XXX-XXXX
但我尝试在同一行中使用 TO_CHAR
、CONCAT
(或 ||
我尝试过两种方式进行串联)和 FM
结果无效的数字或无效的运算符错误(取决于我如何重新排列行中的元素)痛苦地提醒我,我勉强基本的脚本显示严重缺乏对正确使用和语法的理解。
TO_CHAR
和 CONCAT
(||
) 的组合成功生成了一个 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>