在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)。
如何获得“鹅”?
答案 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