【问题标题】:Update using single row query使用单行查询更新
【发布时间】:2019-05-23 04:40:51
【问题描述】:

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

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

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

(888)-333-5555

请告诉我解决方案。

【问题讨论】:

  • 您希望数据库表中每一行的电话号码列的值完全相同吗?
  • 电话号码可以不同,但​​所有行的格式应相同 (888)-888-8888。
  • 您是在问如何在 SQL 中编写 UPDATE 语句,对吗?可以完成您在帖子中描述的任务,对吧?
  • 感谢 Jaspreet Singh。如果忽略括号、连字符等,是否所有记录都一致有 10 位数字,或者是否有一些有 11 位或 7 位或附加国家代码等。数据是否一致包含 10 位数字?
  • @Abra....是的,我想写一条Update sql语句。

标签: sql oracle


【解决方案1】:

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

【讨论】:

  • 感谢您的解决方案...如果可能的话,请您解释一下这段代码的含义 - '[^0-9]{1,}', NULL, 1, 0 表示第二个是 ' (\1)-\2-\3',1,0
猜你喜欢
  • 2022-09-28
  • 2011-08-24
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
相关资源
最近更新 更多