我想使用结构作为UDF的返回类型,然后从结果中提取单个字段。这是我尝试的用例的世界版本:
create temp function udf_struct_test(orig string)
returns struct<original int64, plus1 int64>
language js as """
var original = parseInt(orig);
var plus1 = 1 + original;
return { original, plus1 };
""";
with t as ( select udf_struct_test(cast (input as string)) from unnest([1,2,3,4,5]) input )
select t.original, t.plus1 from t ;
结果:
Error: Name original not found inside t at [10:10]
但是,当我将选择更改为“从t中选择*”时,我得到:
Row f0_.original f0_.plus1
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
我花了很长时间尴尬地尝试使它生效,我想我想念的东西很小/很愚蠢……对吗?
答案 0 :(得分:2)
更新:是的,这有点像我想的那样小/笨。
当我真的想取消引用行源中的列时,我试图引用行源。因此,要做到这一点,所需要做的就是在子查询中为UDF的结果加上别名。即(请注意“ v”别名):
with t as ( select udf_struct_test(cast(input as string)) v from unnest([1,2,3,4,5]) input )
select v.original, v.plus1 from t ;
derp。
任何对stackoverflow元数据有意见的人,如果您认为这篇文章没有任何价值,请随时删除整篇文章。
答案 1 :(得分:2)
这是您的解决方案的替代版本,将UDF返回的结构的字段投影为列:
with t as (
select as value udf_struct_test(cast(input as string))
from unnest([1,2,3,4,5]) input
)
select original, plus1
from t ;
或在返回的结构上使用.*
:
with t as (
select udf_struct_test(cast(input as string)).*
from unnest([1,2,3,4,5]) input
)
select original, plus1
from t ;