Я хочу создать табличную функцию, которая принимает два аргумента, fieldName и параметр, где я могу позже использовать эту функцию для создания таблиц в других парах fieldName и параметра. Я пробовал несколько способов, и кажется, что fieldName (имя столбца) всегда анализируется как строка в предложении 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 — это имя столбца, и предполагается, что оно имеет только значения «да» и «нет»)
Я пытался использовать EXECUTE IMMEDIATE, это работает, но я просто хочу знать, есть ли способ подойти к этому функциональным образом.
Спасибо за любую помощь!
Подробнее см.: https://cloud.google.com/bigquery/docs/reference/standard-sql/table-functions
Обходной путь может заключаться в использовании оператора case
для выбора нужного столбца. Если нужна колонка, используйте решение Михаила Берлянта.
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 прямо или косвенно/обходным путем, возможно, за некоторыми исключениями)
См. пример ниже
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
)
)
Теперь, когда табличная функция создана - запустите ниже, чтобы увидеть результат
select *
from dataset.functionName('state_abbreviation', 'GU')
вы получите запись для ГУАМ
Тогда попробуйте ниже
select *
from dataset.functionName('division_code', '0')
с выходом