首页 > 解决方案 > 使用单行查询更新

问题描述

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

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

但是,我需要使用单个查询更新列,以便更新所有数千条记录并确保数据看起来像这样

(888)-333-5555

请让我知道解决方案。

标签: sqloracle

解决方案


如果目标表中的每个电话号码确实有 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.

推荐阅读