有时候我们可能需要将查询得到的结果进行重复值的筛选,例如我们用下面的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 || '','', '','', 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
出处:http://dolphin0714.cnblogs.com/ (责任编辑:admin) |