PLSQL - 如何复制一行更改列的第一个字符?

PLSQL - How to replicate a row changing columns first characters?

我有一个 table 产品是这样的:

PRODUCT_ID    SUB_PRODUCT_ID    DESCRIPTION   CLASS
----------    --------------    -----------   -----
A001        ACC1                coffeemaker   A
A002        ACC1                toaster       A
A003        ACC2                coffee table  A
A004        ACC5                couch         A

我需要复制一行,只更改某些列中的第一个字符,以便在相同的 table 中获得这样的结果,例如,如果我选择第一行,我想复制 PRODUCT_ID仅更改第一个字母(从 A001 到 B001),SUB_PRODUCT_ID 仅更改第一个字母(从 ACC1 到 BCC1),保留 DESCRIPTION 并更改 CLASS(从 A 到 B)

PRODUCT_ID    SUB_PRODUCT_ID    DESCRIPTION   CLASS
----------    --------------    -----------   -----
A001          ACC1              coffeemaker   A
B001          BCC1              coffeemaker   B

我一直在尝试使用 SUBSTR 函数,但没有得到积极的结果。

假设您的 table 被称为 "products" 并且您想更改所有行(或根据需要添加约束):

insert into products
select 'B'||substr(product_id,2), 'B'||substr(sub_product_id,2), description, 'B'
from product

这是你想要的吗?

insert into products(PRODUCT_ID, SUB_PRODUCT_ID, DESCRIPTION, CLASS)
    select replace(product_id, 'A', 'B'),
           replace(SUB_PRODUCT_ID, 'A', 'B'),
           DESCRIPTION,
           replace(CLASS, 'A', 'B')
    from products
    where class = 'A';

编辑:

replace() 可能有点矫枉过正:

insert into products(PRODUCT_ID, SUB_PRODUCT_ID, DESCRIPTION, CLASS)
    select 'B' || substr(product_id, 2),
           'B' || substr(SUB_PRODUCT_ID, 2),
           DESCRIPTION,
           'B'
    from products
    where class = 'A';
Hi You can do a lilte bit of code twisting and here's the output :)

SELECT 'A001' PID,'ACC1'SPID,'cofeemaker' dsc,'A' clss FROM dual
UNION
SELECT REPLACE(a.pid,SUBSTR(a.pid,1,1),'B') PID,
  REPLACE(a.SPID,SUBSTR(a.spid,1,1),'B')SPID,
  a.dsc,
  REPLACE(a.clss,SUBSTR(a.CLSS,1,1),'B') CLSS
FROM
  (SELECT 'A001' PID,'ACC1'SPID,'cofeemaker' dsc,'A' clss FROM dual
  )a;