Как передать строку имени столбца в качестве параметра в ФУНКЦИЮ CREATE TABLE в BigQuery

Я хочу создать табличную функцию, которая принимает два аргумента, 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, это работает, но я просто хочу знать, есть ли способ подойти к этому функциональным образом.

Спасибо за любую помощь!

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Подробнее см.: 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')     

с выходом

Другие вопросы по теме