ORACLE 字段值去重、排序的函数

1、VARVHAR2类型的字段值进行聚合,并用","隔开,使用LISTAGG函数,自带去重功能:

  LISTAGG(TANK, ',' ) WITHIN
                GROUP (
                        ORDER BY INSP_DATE ) AS TANK



TANK                            TANK
-----                          -------   
Q123      处理结果为:        Q123,Q124,Q125
Q124   --------------->  
Q125


但是对于以下情况的处理结果为:

TANK                                    TANK
-----                                  -------   
Q123,Q124      处理结果为:   Q123,Q124,Q125,Q124,Q125,Q125
Q124,Q125   --------------->  
Q125
Q125


所以需要去重方式来实现,如下:

2、创建存储类型

CREATE OR REPLACE TYPE RPTMGR.t_ret_table IS TABLE OF VARCHAR2(4);

3、创建方法

CREATE OR REPLACE FUNCTION RPTMGR.FN_SPLIT_STRING(VAR_STR   IN STRING,
                                          VAR_SPLIT IN STRING)
  RETURN VARCHAR2 IS
  VAR_OUT     T_RET_TABLE;
  VAR_TMP     VARCHAR2(4000);
  VAR_ELEMENT VARCHAR2(4000);
  V_RS        VARCHAR2(4000);
BEGIN
  VAR_TMP := VAR_STR;
  VAR_OUT := T_RET_TABLE();
  WHILE INSTR(VAR_TMP, VAR_SPLIT) > 0 LOOP
    VAR_ELEMENT := SUBSTR(VAR_TMP, 1, INSTR(VAR_TMP, VAR_SPLIT) - 1);
    VAR_TMP     := SUBSTR(VAR_TMP,
                          INSTR(VAR_TMP, VAR_SPLIT) + LENGTH(VAR_SPLIT),
                          LENGTH(VAR_TMP));
    VAR_OUT.EXTEND(1);
    VAR_OUT(VAR_OUT.COUNT) := VAR_ELEMENT;
  END LOOP;
  VAR_OUT.EXTEND(1);
  VAR_OUT(VAR_OUT.COUNT) := VAR_TMP;
  FOR V_ROW IN (SELECT DISTINCT (COLUMN_VALUE) COLUMN_VALUE
                  FROM TABLE(VAR_OUT)
                 ORDER BY COLUMN_VALUE) LOOP
    EXIT WHEN V_ROW.COLUMN_VALUE IS NULL;
    IF V_RS IS NOT NULL THEN
      V_RS := V_RS || ',' || V_ROW.COLUMN_VALUE;
    ELSE
      V_RS := V_ROW.COLUMN_VALUE;
    END IF;
  END LOOP;
  --DBMS_OUTPUT.put_line(V_RS);
  RETURN V_RS;
END FN_SPLIT_STRING;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sammine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值