雪花是否具有函数LISTAGG(column_name [,delimiter] ON OVERFLOW TRUNCATE)?

时间:2020-04-10 15:26:10

标签: snowflake-cloud-data-platform snowflake-task

Oracle的LISTAGG附带的雪花中似乎不提供“ ON OverfLOW TRUNCATE”功能。 有替代功能或替代方法吗?

2 个答案:

答案 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不提供该选项。以下两条评论可能有助于解释为什么是这种情况:

  1. 定义长度受限制的字符串字段(文本,varchar等)没有性能或存储问题。因此,您可以定义很大的列来处理此问题。
  2. 如果您限制了该字段或数据超出了Snowflake的限制,只需在LISTAGG()函数周围使用LEFT()函数根据字段定义的大小进行限制即可轻松解决此问题字符串字段。