oracle列字段数据逗号拼接的去重,之后重新组成新的字符串

这个博客介绍了一个PL/SQL函数,名为SF_SPLIT_STR,它的作用是将一个包含逗号分隔的字符串拆分成多个独立的项。函数通过使用REGEXP_SUBSTR和CONNECT BY级别来逐个提取字符串中的元素,并最终使用wm_concat将所有提取的项合并为一个单一的VARCHAR2值返回。
摘要由CSDN通过智能技术生成

新建一个function 实现此功能

create or replace FUNCTION SF_SPLIT_STR(strName IN VARCHAR2)
  RETURN VARCHAR2 AS
  v_strName VARCHAR2(5000);
BEGIN
  WITH ACCTS AS
   (SELECT DISTINCT str
      from (SELECT REGEXP_SUBSTR(replace(strName, ', ', ','),
                                 '[^,]+',
                                 1,
                                 LEVEL,
                                 'i') AS STR
              FROM DUAL
            CONNECT BY LEVEL <= LENGTH(replace(strName , ', ', ',')) -
                       LENGTH(REGEXP_REPLACE(replace(strName ,
                                                              ', ',
                                                              ','),
                                                      ',',
                                                      '')) + 1))
  SELECT wm_concat(STR) INTO v_strName FROM ACCTS;
  RETURN v_strName;
END SF_SPLIT_STR;

Oracle数据库中,你可以使用内置的SQL函数以及PL/SQL块来实现这个需求。首先,你需要将字符串通过`SUBSTR`、`INSTR`和`DECODE`等函数分割数组,然后利用`DISTINCT`关键字去除重复项,最后再使用`LISTAGG`函数重新组合字符串。以下是基本步骤: 1. 创建一个临时表或者变量来存储处理后的结果,因为Oracle不直接支持数组操作。 ```sql DECLARE v_input_string VARCHAR2(4000); v_split_values RAW(4000); -- 使用RAW类型可以避免长度限制 v_unique_values RAW(4000); BEGIN -- 假设v_input_string是你需要处理的字段值 v_input_string := 'your_string_with_comma_separated_values'; -- 分割字符串 FOR i IN 1..LENGTH(v_input_string) - LENGTH(REPLACE(v_input_string, ',', '')) + 1 LOOP IF v_input_string INSTR(i, ',') > 0 THEN v_split_values.extend; v_split_values(v_split_values.COUNT) := SUBSTR(v_input_string, i, INSTR(i, ',') - i); END IF; END LOOP; -- 去除重复并重新组合 SELECT DISTINCT SYS_REFCURSOR INTO :v_unique_values FROM TABLE(SYS.DBMS_DEBUG_VC2WRAP(v_split_values)); v_unique_values := DBMS_DEBUG_VC2VAR(v_unique_values); -- 更字段 UPDATE your_table SET your_column = LISTAGG(your_column_value, ',') WITHIN GROUP (ORDER BY your_column_value) OVER (PARTITION BY ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) WHERE ROWNUM = 1; -- 或者根据实际情况调整条件 END; / ``` 记得替换`your_string_with_comma_separated_values`、`your_table`, `your_column`, 和 `your_column_value`为实际的名和表名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值