有時候我們可能需要將查詢得到的結果進行重複值的篩選,例如我們用下面的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
Agoni 2009-12-29