# 起因
因为一些原因导致机场四字码拼接重复,要按原顺序去重,需额外写一个自定义函数供调用。
如字符串为 ZBAA,ZUUU,ZBAA,ZYCC,ZBTJ,ZUUU,ZGSZ 需要去重为 ZBAA,ZUUU,ZYCC,ZBTJ,ZGSZ
# Sql 记录
按原顺序去重没办法使用 Distinct 不然顺序是乱的
# 思路
- 使用 REGEXP_SUBSTR 函数及正则来拆分机场四字码成多行,并使用 ROWNUM 记录行编号;
- 使用 GROUP BY 进行机场四字码的分组查询,使用 MIN() 函数获取最小行编号的机场四字码并去重;
- 使用 LISTAGG() WITHIN GROUP() 函数进行排序,并拼接去重后的机场四字码。
# 自定义函数
自定义函数1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE OR REPLACE FUNCTION FunctionName(AIRPORTS IN VARCHAR2) RETURN VARCHAR2 AS RESAIRPORTS VARCHAR2(200); BEGIN
WITH AIRPORTS AS( SELECT T.AIRPORT, MIN(T.RM) RM FROM (SELECT REGEXP_SUBSTR(AIRPORTS, '[^,]+', 1, LEVEL) AIRPORT, ROWNUM RM FROM DUAL CONNECT BY LEVEL <= REGEXP_COUNT(AIRPORTS, '\,') + 1) T GROUP BY T.AIRPORT) SELECT LISTAGG(A.AIRPORT, ',') WITHIN GROUP(ORDER BY A.RM) AS AIRPORTS INTO RESAIRPORTS FROM AIRPORTS A; RETURN RESAIRPORTS; END ;
|
创建好自定义函数后就可以测试下了
自定义函数1 2 3
| SELECT FunctionName('ZBAA,ZUUU,ZBAA,ZYCC,ZBTJ,ZUUU,ZGSZ') AS AIRPORTS FROM DUAL
|
查询到的数据为 ZBAA,ZUUU,ZYCC,ZBTJ,ZGSZ ,问题解决了。