这会从数组中删除元素,但会将字段重命名为 v。
有一个更好的方法吗?或者我可以获得结构的第一个元素(例如 t[0])吗?
CREATE TEMP FUNCTION remove(arr ANY TYPE, val ANY TYPE) AS ((
SELECT ARRAY_AGG(t)
FROM (SELECT * FROM UNNEST(arr) v) t
WHERE t.v <> val
));
这会从数组中删除元素,但会将字段重命名为 v。
有一个更好的方法吗?或者我可以获得结构的第一个元素(例如 t[0])吗?
CREATE TEMP FUNCTION remove(arr ANY TYPE, val ANY TYPE) AS ((
SELECT ARRAY_AGG(t)
FROM (SELECT * FROM UNNEST(arr) v) t
WHERE t.v <> val
));
有一个更好的方法吗?
使用以下精简版
CREATE TEMP FUNCTION remove(arr ANY TYPE, val ANY TYPE) AS ((
SELECT ARRAY_AGG(v)
FROM UNNEST(arr) v
WHERE v <> val
));
正如您所展示的,可以从数组 (arr) 中删除任何元素 (val)。把t.v
里面放在SELECT_ARRAY_AGG
让输出如预期的那样。
CREATE TEMP FUNCTION remove(arr ANY TYPE, val ANY TYPE) AS ((
SELECT ARRAY_AGG(t.v)
FROM (SELECT * FROM UNNEST(arr) v) t
WHERE t.v <> val
));
select remove([1,2,3,4,5],3) as array_without_3
提取结构的第一个元素是可能的。然而,这是一个丑陋的解决方法:
CREATE TEMP FUNCTION firstelement(arr string)
returns string
LANGUAGE js as
"""
var tmp=JSON.parse(arr);
var var1=arr.substring(2,arr.search(':',)-1);
if(!var1.includes('{')) {
return tmp[var1];
}
""";
Select firstelement(TO_JSON_STRING(A)) as A, cast(firstelement(TO_JSON_STRING(B)) as int64) as B,
from (
select struct( "4a" as z,2 as b , 9 as bb) as A, struct( 4 as z,2 as b , 9 as bb) as B
);
首先,必须将结构转换为 JSON 字符串。该函数查找第一个条目的名称并将该信息保存在var1
. 该字符串被转换为 JSON 并且具有名称的元素var1
被读出并由函数作为字符串返回。如果它是一个数字,则在 select 语句中按需要进行强制转换。