获取未知大小数组的最后一个元素

时间:2020-03-02 20:06:35

标签: sql snowflake-cloud-data-platform

在Snowflake中,我可以在不知道数组长度的情况下获取数组的第一个元素:

with foo as (
  select array_construct('duck','duck','goose') as a
)
select a[0] from foo -- returns 'duck'

但是要获取最后一个元素,我不能使用“ pythonic” a[-1],因为select a[-1] from foo返回:

无效的提取路径'-1':数组索引-1超出范围;必须在0到2,147,483,647之间。

有趣的是,我可以使用array_slice()来获取 next-to-last 元素:

select array_slice(a,-2,-1) from foo -- returns 'duck'

但不是最后一个元素,因为“输出包括直到但不包括参数指定的[sic]元素”(doc)。

如何获得“鹅”?

3 个答案:

答案 0 :(得分:2)

我们可以使用a[len(a)-1]方法:

with foo as (
  select array_construct('duck','duck','goose') as a
)
select a[array_size(a)-1]::varchar from foo -- returns 'goose'

答案 1 :(得分:1)

这应该有效。

CREATE OR REPLACE FUNCTION ARRAY_ELEMENT(a ARRAY,b double)
RETURNS STRING
LANGUAGE JAVASCRIPT
AS '
    if (B < 0) 
    {
        element = A[A.length + B];
    }
    else
    {
        element = A[B];
    }
    return element
';

select ARRAY_ELEMENT(array_construct(0,1,2,3,4,5,6),-1); //returns 6
select ARRAY_ELEMENT(array_construct(0,1,2,3,4,5,6),-2); //returns 5

答案 2 :(得分:0)

类似于 C8H10N4O2 的答案,但没有 CTE:

select  array_construct('duck','duck','goose') AS birds ,
birds[array_size(birds)-1]::STRING AS lastbird