【问题标题】:Oracle SQL inserting parenthesis into phone numberOracle SQL在电话号码中插入括号
【发布时间】:2016-05-13 14:50:23
【问题描述】:

原格式:

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"

【问题讨论】:

  • 你绝对在数据库引擎中做吗?
  • 是的,这很不方便。有其他括号插入的文档,只是不在与此相同的环境中。
  • 我明白现在发生了什么

标签: sql oracle formatting substring concatenation


【解决方案1】:

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

【讨论】:

  • @lolocpp 哦,天哪……您在SELECT前面 中有一个|| 运算符。它现在应该可以运行了,因为我已经删除了它。
  • 这是不正确的,因为它会给出输出(123)-45 6-78。但是,您需要(123)456-7890。不需要' ' 即空格。
【解决方案2】:

使用 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>

请记住,SUBSTRindex1 开始。使用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>

【讨论】:

    【解决方案3】:

    你可以使用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
    

    【讨论】:

      【解决方案4】:
      SELECT '123-456-7890','('||SUBSTR('123-456-7890',1,3)||')'||SUBSTR('123-456-7890',5,8) FROM dual;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-22
        • 2014-07-27
        • 2013-12-09
        • 1970-01-01
        相关资源
        最近更新 更多