如何在Oracle数据库中更新/更改部分字符串

svmlkihl  于 2022-12-03  发布在  Oracle
关注(0)|答案(2)|浏览(292)

我必须更新Oracle数据库,删除字符串的一部分,问题是这部分可能在此字符串的多个位置。例如:
我必须移除部分并更新数据库,其中clolumn_name like('%,aaa %')来自
"bbb,aaa,ccc,ddd"或"bbb,ccc,aaa,ddd"或来自"bbb,ccc,eee,fff,aaa,ddd"
请帮助我:)

cs7cruho

cs7cruho1#

要使用简单的字符串函数(比正则表达式快得多)替换完整的术语,请执行以下操作:

SELECT TRIM(
         BOTH ',' FROM
         REPLACE(','||value||',', ',aaa,', ',')
       ) AS replaced_value
FROM   table_name

其中,对于示例数据:

CREATE TABLE table_name ( value ) AS
SELECT 'aaa' FROM DUAL UNION ALL
SELECT 'aaa,bbb' FROM DUAL UNION ALL
SELECT 'ccc,aaa' FROM DUAL UNION ALL
SELECT 'ddd,aaa,eee' FROM DUAL UNION ALL
SELECT 'fff,aaa,ggg,aaa,hhh' FROM DUAL UNION ALL
SELECT 'aaa,aaa,aaa' FROM DUAL;

输出:
| 替换值|
| - -|
| * 空值 *|
| bbb的复数|
| ccc格式|
| ddd,eee|
| 哇,哇,哇|
| 美国汽车协会|

  • 注意:如果你可以有多个连续的术语,就像上一个例子,那么使用简单的字符串函数将不起作用;但在其他情况下,当有非连续重复项时,它将起作用。

如果可以有多个连续的重复项,则可以使用REGEXP_REPLACE

SELECT TRIM(
         BOTH ',' FROM
         REGEXP_REPLACE(','||value||',', '(,aaa)+,', ',')
       ) AS replaced_value
FROM   table_name

输出:
| 替换值|
| - -|
| * 空值 *|
| bbb的复数|
| ccc格式|
| ddd,eee|
| 哇,哇,哇|
| * 空值 *|
fiddle
至于你的评论:
我必须更新column_name like ('%,aaa%,)数据库
如果要从每个术语的开头删除aaa(并删除空术语),则:

UPDATE table_name
SET value = TRIM(
              BOTH ',' FROM 
              REGEXP_REPLACE(
                REGEXP_REPLACE(value, '(^|,)aaa', '\1'),
                ',{2,}',
                ','
              )
            )
WHERE value LIKE '%,aaa%'
OR    value LIKE 'aaa%'

fiddle

dbf7pr2w

dbf7pr2w2#

您可以在此处使用正则表达式替换方法:

SELECT val, TRIM(BOTH ',' FROM REGEXP_REPLACE(val, 'aaa,|,aaa,|,aaa', ',')) AS val_out
FROM yourTable;

Demo(第一个字母)

如果需要更新,请用途:

UPDATE yourTable
SET val = TRIM(BOTH ',' FROM REGEXP_REPLACE(val, 'aaa,|,aaa,|,aaa', ','))
WHERE ',' || val || ',' LIKE '%,aaa,%';

相关问题