使用单行查询更新

时间:2019-05-22 16:10:39

标签: sql oracle

我有大约数千条记录,我需要更新一列包含电话号码的列。我的表(客户)中有这样的电话号码-

  

12345678,888-888-8888,(888)-333-5555,555-555

但是我需要通过一个查询来更新该列,以便所有千条记录都得到更新,并确保数据看起来像这样

  

(888)-333-5555

请让我知道解决方法。

1 个答案:

答案 0 :(得分:0)

如果目标表中的每个电话号码确实具有10位数字(依次带有可变的括号和连字符等),则可以通过两阶段的正则表达式替换来重新格式化它。

下面是一个示例,它使用一个名为LOREM的表,其电话号码字段为IPSUM

创建测试表:

CREATE TABLE LOREM(IPSUM VARCHAR2(32));
INSERT INTO LOREM VALUES ('1234567890');
INSERT INTO LOREM VALUES ('888-888-8888');
INSERT INTO LOREM VALUES ('(888)-333-5555');
COMMIT;

初始状态:

SELECT IPSUM 
FROM LOREM
ORDER BY 1 ASC;

            IPSUM
_________________
(888)-333-5555
1234567890
888-888-8888

然后进行更新。这有两个正则表达式替换。首先,它抛出不是数字的任何东西。然后将10位数字重新格式化为(###)-###-####:

UPDATE LOREM SET IPSUM = REGEXP_REPLACE(
   REGEXP_REPLACE(IPSUM, '[^0-9]{1,}', NULL, 1, 0),
    '([0-9]{3})([0-9]{3})([0-9]{4})', '(\1)-\2-\3',1,0 );


3 rows updated.

然后检查结果:

SELECT IPSUM
FROM LOREM
ORDER BY 1 ASC;

            IPSUM
_________________
(123)-456-7890
(888)-333-5555
(888)-888-8888


3 rows selected.