我用REGEXP_REPLACE创建了一个LISTAGG。现在我想把逗号换成竖线。
查询:
SELECT
ID,
REGEXP_REPLACE(LISTAGG (user_name, ',') WITHIN GROUP (ORDER BY user_name ), '([^,]+)(,\1)(,|$)', '\1|\3')
From my_table;
输出:
|ID|USER_NAME |
|1 |A1|,B12|,C32|
|2 |A1 |
|3 |B12,C32 |
我想看到的是
|ID|USER_NAME |
|1 |A1|B12|C32|
|2 |A1 |
|3 |B12|C32 |
逗号应在何处删除。
代码看起来是什么样的?
3条答案
按热度按时间5hcedyr01#
最好只获取列表中的
DISTINCT
项,然后可以使用'|'
作为LISTAGG
中的分隔符,而不是','
:如果你不能使用
DISTINCT
,那么你需要匹配整个术语,你可以通过在每个术语前面加上一个分隔符,然后聚合,然后匹配重复的术语,包括周围的分隔符,并删除重复项;最后,你需要删除前导和尾随分隔符以及术语之间的双分隔符。注意:如果你简单地匹配部分项,你会发现
abc|abcdef|defghi
被转换为abcdefghi
,这是不正确的。像这样:
其中,对于样本数据:
输出:
| ID|用户名|
| - -----|- -----|
| 1| abc| abcdef| def| defghi|
fiddle
kgsdhlau2#
vs3odd8k3#
只需在调用
LISTAGG
时将,
替换为|
即可: