ORACLE-删除同一字段中重复值函数

有时候我们可能需要将查询得到的结果进行重复值的筛选,例如我们用下面的SQL语句查询出结果

语句:

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 || ','','11> 1 THEN
13       --以','分隔截取字段
14       StrTemp := SUBSTR(TempReportNo,
15                         1,
16                         INSTR(TempReportNo || ','','11- 1);
17     END IF;
18     --判断是否已经存在相同值,这里前后一定要加分隔符
19     IF INSTR(',' || StrReportNo || ','',' || StrTemp || ','11= 0 THEN
20       --累加不同结果
21       StrReportNo := StrReportNo || ',' || StrTemp;
22     END IF;
23     --将判断过的字段删除掉
24     TempReportNo := SUBSTR(TempReportNo,
25                            INSTR(TempReportNo || ','','11+ 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

                                                                                                                                                    

  Agoni  2009-12-29        

posted @ 2009-12-29 07:31  ヅ兲使ぺぴ  阅读(1700)  评论(3编辑  收藏  举报