当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
ORACLE删除同一字段中重复值函数
发布时间:2010/8/13 11:00:01 来源:城市学习网 编辑:ziteng
  语句:
  Select SEQ_NO,REPORT_NO from Imp_Report
  结果:
  SEQ_NO    REPORT_NO
  -------------------------------
  N320410A091130000600   320410109092905,320410109093647,320410109095568,320410109093647
  N320410A091130000601   320410109096320,320410109097222,320410109097222
  实际想要的结果:
  SEQ_NO    REPORT_NO
  -------------------------------
  N320410A091130000600   320410109092905,320410109093647,320410109095568
  N320410A091130000601   320410109096320,320410109097222
  我自己研究写了个函数
  SQL语句
  1 CREATE OR REPLACE FUNCTION FUN_IMP_REPORT_EXCLUDE_REPEAT(Report_No IN NVARCHAR2)
  2   RETURN NVARCHAR2 IS
  3   StrReportNo  NVARCHAR2(2000);
  4   StrTemp      NVARCHAR2(2000);
  5   TempReportNo NVARCHAR2(2000);
  6 BEGIN
  7   StrReportNo  := '';
  8   StrTemp      := '';
  9   TempReportNo := Report_No;
  10   LOOP
  11     --判断参数有没有值
  12     IF INSTR(TempReportNo || ',', ',', 1, 1) > 1 THEN
  13       --以','分隔截取字段
  14       StrTemp := SUBSTR(TempReportNo,
  15                         1,
  16                         INSTR(TempReportNo || ',', ',', 1, 1) - 1);
  17     END IF;
  18     --判断是否已经存在相同值,这里前后一定要加分隔符
  19     IF INSTR(',' || StrReportNo || ',', ',' || StrTemp || ',', 1, 1) = 0 THEN
  20       --累加不同结果
  21       StrReportNo := StrReportNo || ',' || StrTemp;
  22     END IF;
  23     --将判断过的字段删除掉
  24     TempReportNo := SUBSTR(TempReportNo,
  25                            INSTR(TempReportNo || ',', ',', 1, 1) + 1);
  26     --参数所有值完成过滤判断后跳出循环
  27     EXIT WHEN length(TempReportNo) = 0 or TempReportNo is null;
  28   END LOOP;
  29   RETURN SUBSTR(StrReportNo, 2); --累加时其实是以','开始的
  30 END FUN_IMP_REPORT_EXCLUDE_REPEAT;
  最终的SQL语句:
  Select SEQ_NO,FUN_IMP_REPORT_EXCLUDE_REPEAT(REPORT_NO) from Imp_Report
广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved