0
点赞
收藏
分享

微信扫一扫

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

紫荆峰 2022-03-11 阅读 124

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;
举报

相关推荐

0 条评论