将Oracle SQL中的表中的整个列值更新为不同的格式

tmb3ates  于 2023-06-29  发布在  Oracle
关注(0)|答案(1)|浏览(99)

考虑表barcode有一个名为b_values的列,其中的值以两种不同的格式存储。一个有破折号,另一个没有。
例如,XXXXXXXXXXXXXXX-> XXX-XXXX-XXXXXXX-X
不带破折号的长度为15,带破折号的长度为18。
我试着跟随,但它没有工作。

UPDATE barcode b
   SET b.barcode = CASE
                     WHEN b.barcode LIKE '%-%-%-%' THEN
                      b.barcode
                     WHEN b.barcode NOT LIKE '%-%-%-%' AND LENGTH(b.barcode) = 15 THEN
                      SUBSTR(b.barcode, 0, 3).CONCAT('-').CONCAT(SUBSTR(b.barcode, 4, 4)).CONCAT('-').
                      CONCAT(SUBSTR(b.barcode, 7, 7)).CONCAT('-').CONCAT(SUBSTR(b.barcode, 14, 1))
                     ELSE
                      b.barcode
                   END

我正试图在一个脚本,这将发现所有的价值观,没有破折号在同一列,并更新他们,包括破折号。
我不需要查询结果中的值。我正在尝试更新表中存储的值。

kwvwclae

kwvwclae1#

您可以按以下方式执行此操作:

UPDATE mytable
SET barcode = SUBSTR(barcode, 1, 3) || '-' || SUBSTR(barcode, 4, 4) || '-' || SUBSTR(barcode, 8, 7) || '-' ||  SUBSTR(barcode, 15, 1)               
WHERE barcode NOT LIKE '%-%-%-%' AND LENGTH(barcode) = 15

Demo here

相关问题