【问题标题】:User defined data types in standard SQL (BigQuery)?标准 SQL (BigQuery) 中的用户定义数据类型?
【发布时间】:2020-02-25 10:59:38
【问题描述】:

是否可以在标准 SQL 中创建用户定义的数据类型,然后可以从 SQL 代码本身中引用?

例如,假设我想创建一个函数,该函数将采用 STRUCT 的两个实例——每个实例包含三个 STRING 类型的条目。这需要写这样的东西;

CREATE TEMP FUNCTION myFunc(x STRUCT<STRING, STRING, STRING>, y STRUCT<STRING, STRING, STRING>) AS (...);

我想做的事情是这样的(伪代码);

CREATE TYPE myType STRUCT<STRING, STRING, STRING>
CREATE TEMP FUNCTION myFunc(x myType, y myType) AS (...)

【问题讨论】:

  • 不,很遗憾,这是不可能的。你还是得用第一种方法。
  • 如果您认为这对 BigQuery 很有用,您可以在此处添加功能请求:issuetracker.google.com/issues/…

标签: sql google-bigquery


【解决方案1】:

类似的方法是使用 ANY TYPE 来创建您的函数,例如:

CREATE TEMP FUNCTION myFunc(x ANY TYPE, y ANY TYPE) AS (...);

回答cmets中的问题,如果需要强类型检查,你仍然可以这样做,并使用检查myFunc()的参数,如果类型不兼容则报错:

CREATE TEMP FUNCTION check_type_x(x ANY TYPE) AS (STRUCT(x.a, x.b, x.c));


SELECT myFunc(check_type_x(col1), check_type_x(col2));

【讨论】:

  • 这与拥有用户定义的类型不同。 ANY TYPE 子句允许将任何数据类型的参数传递给函数,因此 BigQuery 在调用函数时根本不会尝试验证数据类型。这基本上是用户定义的数据类型(如果它们存在于 BigQuery 中)的相反效果,即使数据类型定义比默认类型更具限制性。
  • @NathanGriffiths 我同意你所说的一切。但是,这里可能只需要语法糖。如果在函数内部,x.a、x.b 和 x.c 都被引用,如果传入的类型没有它们,BigQuery 仍会向您提供错误消息。这意味着您可以定义一个函数CREATE FUNCTION type_x(x ANY TYPE) AS (STRUCT(x.a, x.b, x.c)); 让您的类型检查任何类型的类型。
  • 还为我的类型检查@NathanGriffiths 的答案添加了一个小技巧。
猜你喜欢
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多