gpt4 book ai didi

sql - 相当于 BigQuery 标准 SQL 中的 typedef

转载 作者:行者123 更新时间:2023-12-04 10:52:41 24 4
gpt4 key购买 nike

在编写 BigQuery 函数时,我一直重复使用相同的结构声明,其中一些声明很长,因为它们表示复杂的结构。

在以下示例中,包含字段 a 的表和 b定义了一个函数 addsuffix定义为基本上需要接收和返回表行。要定义函数,需要将重复这两个字段定义的 STRUCT 明确指定为输入和输出。

CREATE TABLE mytable (
a STRING, b STRING -- a, b fields defined in schema
);

CREATE FUNCTION addsuffix(
row STRUCT<a STRING, b STRING> -- repeated in input parameter def
)
RETURNS STRUCT<a STRING, b STRING> AS ( -- repeated in output parameter def
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);

SELECT addsuffix(r) AS withsuffix FROM mytable r;

这是非常多余的,并且不允许遵守 DRY 原则。有没有办法定义一个封装一次STRUCT定义的“typedef”,这样它就可以多次重用而不重复?因此,该函数将类似于以下内容:

TYPEDEF row_type AS STRUCT (a STRING, b STRING); -- defined once
CREATE TEMP FUNCTION addsuffix(row row_type) -- reused in input def
RETURNS row_type AS ( -- reused in output def
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);

假设没有这样的语言特征 - 是否有一些等效的模式可以使用,以便不必一遍又一遍地重复相同的结构定义?

最佳答案

作为一个简单的修复,使用 ANY TYPE - 即使您没有定义输入变量,函数也能工作:

CREATE TABLE temp.mytable (a STRING, b STRING);INSERT INTO temp.mytable (a,b) VALUES('aaa','bbb')
;

CREATE TEMP FUNCTION addsuffix(row ANY TYPE)
RETURNS STRUCT<a STRING, b STRING> AS (
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);

SELECT addsuffix(r) AS withsuffix FROM temp.mytable r;

enter image description here

那么你也可以跳过 RETURNS部分与 SQL UDF:

CREATE TEMP FUNCTION addsuffix(row ANY TYPE) AS (
STRUCT(CONCAT(row.a, '_a_suffix') AS a, CONCAT(row.b, '_b_suffix') AS b)
);

SELECT addsuffix(r) AS withsuffix FROM temp.mytable r;

最终结果:否 TYPEDEF任何地方都需要!

查看这篇文章,了解一些有趣的 UDF:
  • https://medium.com/@hoffa/new-in-bigquery-persistent-udfs-c9ea4100fd83
  • 关于sql - 相当于 BigQuery 标准 SQL 中的 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59394638/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com