Oracle的LISTAGG附带的雪花中似乎不提供“ ON OverfLOW TRUNCATE”功能。 有替代功能或替代方法吗?
答案 0 :(得分:2)
select listagg(str, ', ') within group (order by id) as listagg
from (
select id
,str
,sum(length(str))over(order by id) as s_str
from (
select * from values(1,'abcdef'),(2,'dfgsdfh'),(3,'jgeg'),(4,'ergegr') s(id,str)
)
qualify s_str <= 20
);
给出总计值(在定界符之前)
,sum(length(str)+2)over(order by id) as s_str
允许您考虑定界符','的大小
或者如果您想要一些像'...'
这样的截断后缀,则可以这样做。.
select listagg(str, ', ') within group (order by id) as listagg
from (
select id
,s_str <= 20 as underlimit
,iff(underlimit, str, '...') as str
from (
select id
,str
,sum(length(str)+2)over(order by id) as s_str
from (
select * from values(1,'abcdef'),(2,'dfgsdfh'),(3,'jgeg'),(4,'ergegr') s(id,str)
)
)
qualify underlimit or row_number() over (partition by underlimit order by id) = 1
);
给予
LISTAGG
'abcdef, dfgsdfh, ...'
重写为不会改变任何内容的CTE ...
with data as (
select id
,str
,sum(length(str)+2)over(order by id) as s_str
from values
(1,'abcdef'),
(2,'dfgsdfh'),
(3,'jgeg'),
(4,'ergegr')
s(id,str)
), check_length_and_limit as (
select id
,s_str <= 20 as underlimit
,iff(underlimit, str, '...') as str
from data
qualify underlimit or row_number() over (partition by underlimit order by id) = 1
)
select listagg(str, ', ') within group (order by id) as listagg
from check_length_and_limit;
答案 1 :(得分:0)
否,Snowflake不提供该选项。以下两条评论可能有助于解释为什么是这种情况: