# 起因

因为一些原因导致机场四字码拼接重复,要按原顺序去重,需额外写一个自定义函数供调用。
如字符串为 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 ,问题解决了。

更新于 阅读次数