0

这会从数组中删除元素,但会将字段重命名为 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
    ));
4

3 回答 3

1

有一个更好的方法吗?

使用以下精简版

CREATE TEMP FUNCTION remove(arr ANY TYPE, val ANY TYPE) AS ((
  SELECT ARRAY_AGG(v) 
  FROM UNNEST(arr) v
  WHERE v <> val
));
于 2021-07-29T21:19:00.633 回答
0

正如您所展示的,可以从数组 (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

于 2021-07-29T18:15:55.340 回答
0

提取结构的第一个元素是可能的。然而,这是一个丑陋的解决方法:

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 语句中按需要进行强制转换。

于 2021-07-29T20:45:36.440 回答