如何将列名字符串作为参数传递到 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')     

有输出