Oracle SQL将括号插入电话号码

时间:2016-02-04 05:50:32

标签: sql oracle formatting substring concatenation

原始格式:

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"

4 个答案:

答案 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;