使用自动生成的值更新每一行

Update every row with auto-generated value

我有一个 table:

CREATE TABLE "person" (
    "ID" NUMBER(38,0), 
    "NAME" VARCHAR2(50 CHAR)
)

数据:

id名称 1 莫妮卡 2 空 3 空 4 斯蒂芬 5 空

我需要使用值“person”和自动增量值(从 1 - person1、person2、person3 等)更新空值:

1 monica 
2 person1
3 person2
4 stephan
5 person3

我应该使用什么 sql (oracle) 查询?

不需要解析函数。更新可以像这样简单地完成:

UPDATE person
   SET NAME = 'person' || ROWNUM
 WHERE name IS NULL;

更新

由于人号需要和人的ID连续,所以可以用这个查询:

UPDATE person p
   SET p.name =
              'person'
           || (SELECT person_number
                 FROM (SELECT p2.id, ROW_NUMBER () OVER (ORDER BY p2.id) AS person_number
                         FROM person p2
                        WHERE name IS NULL)
                WHERE id = p.id)
 WHERE p.name IS NULL;

您实际上有 2 个问题,尽管您的问题只解决了其中 1 个。你不仅要'fix the data'还要'fix the system'。第二个(未解决的)是最重要的。有 2 个方法,让我们调用它们

  1. 正确的方法
-- update existing data
update person1
   set name = 'PERSON' || to_char(rownum,'FM999') 
 where id is null;

-- fix the system
alter table person modify name not null; 
  1. band-aid 方法
-- prepare for long term bandaid 
create sequence unknown_person_seq;

-- update existing data
update person
   set name = 'PERSON' || to_char(unknown_person_seq.nextval, 'FM99')
 where name is null;
select * from person2; 

-- adjust the system
alter table person modify name default 'Person' || to_char(unknown_person_seq.nextval, 'FM99');

不同之处在于正确的方法可以防止系统进一步损坏数据。参见 demo here。为无效数据引发异常比允许或生成虚假数据要好得多。假设您的 Person table 持有客户信息,您将他们称为 PERSON4。他们将成为您的客户多长时间?

有效:

SET
    name = (
    SELECT n
    FROM(
        SELECT
            id, 'person' || ROW_NUMBER() OVER (ORDER BY id) AS n
        FROM
            person
                WHERE
            name IS NULL
        )u
    WHERE
        u.id = person.id)
        WHERE
    NAME IS NULL