如何将列名字符串作为参数传递到 BigQuery 中的 CREATE TABLE FUNCTION
How to pass a string of column name as a parameter into a CREATE TABLE FUNCTION in BigQuery
我想创建一个带有两个参数的 table 函数,fieldName 和 parameter,稍后我可以在其中使用此函数在其他 fieldName 和参数对中创建 tables。我尝试了多种方法,似乎 fieldName(column name) 在 where 子句中总是被解析为一个字符串。想知道我应该如何以正确的方式执行此操作。
CREATE OR REPLACE TABLE FUNCTION dataset.functionName( fieldName ANY TYPE, parameter ANY TYPE)
as
(SELECT *
FROM `dataset.table`
WHERE format("%t",fieldName ) = parameter
)
稍后调用该函数为
SELECT *
from dataset.functionName( 'passed_qa', 'yes')
(passed_qa 是一个列名,假设它只有 'yes' 和 'no' 值)
我试过使用 EXECUTE IMMEDIATE,它有效,但我只是想知道是否有办法以实用的方式解决这个问题。
感谢您的帮助!
详情见:
https://cloud.google.com/bigquery/docs/reference/standard-sql/table-functions
A work-around 可以使用 case
语句 select 所需的列。如果需要任何柱子,请使用 Mikhail Berlyant 的解决方案。
Create or replace table function Test.HL(fieldName string,parameter ANY TYPE)
as
(
SELECT *
From ( select "1" as tmp, 2 as passed_qa) # generate dummy table
Where case
when fieldName="passed_qa" then format("%t",passed_qa)
when fieldName="tmp" then format("%t",tmp)
else ERROR(concat('column ',fieldName,' not found')) end = parameter
)
好消息 - 这是可能的!!!(旁注:根据我的经验 - 我还没有遇到过无法解决问题的案例直接在 BigQuery 中实现或 indirectly/workaround 可能有一些例外)
参见下面的示例
create or replace table function dataset.functionName(fieldName any type, parameter any type)
as (
select * from `bigquery-public-data.utility_us.us_states_area` t
where exists ( select true
from unnest(`bqutil.fn.json_extract_keys`(to_json_string(t))) key with offset
join unnest(`bqutil.fn.json_extract_values`(to_json_string(t))) value with offset
using(offset)
where key = fieldName and value = parameter
)
)
现在,当 table 函数创建时 - 运行 见下面的结果
select *
from dataset.functionName('state_abbreviation', 'GU')
您将获得关岛的记录
然后尝试下面
select *
from dataset.functionName('division_code', '0')
有输出
我想创建一个带有两个参数的 table 函数,fieldName 和 parameter,稍后我可以在其中使用此函数在其他 fieldName 和参数对中创建 tables。我尝试了多种方法,似乎 fieldName(column name) 在 where 子句中总是被解析为一个字符串。想知道我应该如何以正确的方式执行此操作。
CREATE OR REPLACE TABLE FUNCTION dataset.functionName( fieldName ANY TYPE, parameter ANY TYPE)
as
(SELECT *
FROM `dataset.table`
WHERE format("%t",fieldName ) = parameter
)
稍后调用该函数为
SELECT *
from dataset.functionName( 'passed_qa', 'yes')
(passed_qa 是一个列名,假设它只有 'yes' 和 'no' 值)
我试过使用 EXECUTE IMMEDIATE,它有效,但我只是想知道是否有办法以实用的方式解决这个问题。
感谢您的帮助!
详情见: https://cloud.google.com/bigquery/docs/reference/standard-sql/table-functions
A work-around 可以使用 case
语句 select 所需的列。如果需要任何柱子,请使用 Mikhail Berlyant 的解决方案。
Create or replace table function Test.HL(fieldName string,parameter ANY TYPE)
as
(
SELECT *
From ( select "1" as tmp, 2 as passed_qa) # generate dummy table
Where case
when fieldName="passed_qa" then format("%t",passed_qa)
when fieldName="tmp" then format("%t",tmp)
else ERROR(concat('column ',fieldName,' not found')) end = parameter
)
好消息 - 这是可能的!!!(旁注:根据我的经验 - 我还没有遇到过无法解决问题的案例直接在 BigQuery 中实现或 indirectly/workaround 可能有一些例外)
参见下面的示例
create or replace table function dataset.functionName(fieldName any type, parameter any type)
as (
select * from `bigquery-public-data.utility_us.us_states_area` t
where exists ( select true
from unnest(`bqutil.fn.json_extract_keys`(to_json_string(t))) key with offset
join unnest(`bqutil.fn.json_extract_values`(to_json_string(t))) value with offset
using(offset)
where key = fieldName and value = parameter
)
)
现在,当 table 函数创建时 - 运行 见下面的结果
select *
from dataset.functionName('state_abbreviation', 'GU')
您将获得关岛的记录
然后尝试下面
select *
from dataset.functionName('division_code', '0')
有输出