原始格式:
123-456-7890
我的目标格式:
(123)456-7890
我想要在子串之间连接的路线,但我不断被标记为错误。我不确定一种更好的方法来实现格式化方法。
我的查询:
select || '(' || substr(telephone,0, 3)|| ')' ||
substr(telephone,4, 3)|| ' '||
substr(telephone,7, 4)) as telephone,
from book;
我当前的错误:
"missing expression"
答案 0 :(得分:0)
在SELECT
的末尾有一个额外的悬空括号,前面还有一个悬空连接操作符||
。试试这个:
SELECT '(' || SUBSTR(telephone, 0, 3) || ')' ||
SUBSTR(telephone, 4, 3) || ' ' || SUBSTR(telephone, 7, 4) AS telephone
FROM book
<强>更新强>
你应该真的使用这个查询,因为事实证明你也遇到了形成所需输出的问题:
SELECT '(' || SUBSTR(telephone, 1, 3) || ')' || SUBSTR(telephone, 5, 8) AS telephone
FROM book
答案 1 :(得分:0)
使用 SUBSTR :
SQL> WITH sample_data AS(
2 SELECT '123-456-7890' num FROM dual
3 )
4 -- end of sample_data mimicking real table
5 SELECT num,
6 '('
7 || SUBSTR(num, 1, 3)
8 ||
9 ')'
10 || SUBSTR(num, 5, 8) AS my_num
11 FROM sample_data;
NUM MY_NUM
------------ ---------------
123-456-7890 (123)456-7890
SQL>
请注意, SUBSTR 的索引从1
开始。使用0
作为起始索引是不好的做法。
您也可以使用 REGEXP_REPLACE 执行此操作。
模式:(\d{3})(-)(\d{3})(-)(\d{4})
表达式:regexp_replace(num, '(\d{3})(-)(\d{3})(-)(\d{4})', '(\1)\3\4\5')
例如,
SQL> WITH sample_data AS(
2 SELECT '123-456-7890' num FROM dual
3 )
4 -- end of sample_data mimicking real table
5 SELECT num,
6 regexp_replace(num, '(\d{3})(-)(\d{3})(-)(\d{4})', '(\1)\3\4\5') my_num
7 FROM sample_data;
NUM MY_NUM
------------ ---------------
123-456-7890 (123)456-7890
SQL>
答案 2 :(得分:0)
您可以使用regular expressions
来执行此操作。
select regexp_replace
(phoneNo,
'([[:digit:]]{3})\-([[:digit:]]{3})\-([[:digit:]]{4})',
'(\1)\2-\3'
)
from(
select '123-456-7890' as phoneNo from dual)
输出
(123)456-7890
答案 3 :(得分:0)
SELECT '123-456-7890','('||SUBSTR('123-456-7890',1,3)||')'||SUBSTR('123-456-7890',5,8) FROM dual;