Google cloud platform 如何在Bigquery中使用字符串作为列名

Google cloud platform 如何在Bigquery中使用字符串作为列名,google-cloud-platform,google-bigquery,Google Cloud Platform,Google Bigquery,有一种情况是,我接收到bigquery函数的字符串,需要将其用作列名。 下面是函数 CREATE OR REPLACE FUNCTION METADATA.GET_VALUE(column STRING, row_number int64) AS ( (SELECT column from WORK.temp WHERE rownumber = row_number) ); 当我将此函数调用为时,选择METADATA.GET_值(“TXCAMP10”,149)我得到的值是TXCAMP10,因此

有一种情况是,我接收到bigquery函数的字符串,需要将其用作列名。 下面是函数

CREATE OR REPLACE FUNCTION METADATA.GET_VALUE(column STRING, row_number int64) AS (
(SELECT column from WORK.temp WHERE rownumber = row_number)
);
当我将此函数调用为
时,选择METADATA.GET_值(“TXCAMP10”,149)
我得到的值是
TXCAMP10
,因此我们可以说它被处理为
从WORK.temp中选择“TXCAMP10”,其中rownumber=149
但我需要它作为
从WORK.temp中选择TXCAMP10。其中rownumber=149
从temp表中返回一些值让我们假设该值为
A

因此,最终我需要值
A
而不是列名,即
TXCAMP10

我尝试使用execute immediate,如
execute immediate(“从WORK.temp WHERE rownumber=“| | row|u number)
from中选择“| | column | | |”来解决此问题,但结果证明我无法在函数中使用它


如何实现所需的结果?

我认为,借助BigQuery中标准SQL中的自定义项,您无法实现此结果

但可以使用BigQuery中的存储过程执行此操作,并执行IMMEDIATE语句。考虑一下这个代码,它模拟了你的情况:

create or replace table d1.temp(
  c1 int64,
  c2 int64
);

insert into d1.temp values (1, 1), (2, 2);

create or replace procedure d1.GET_VALUE(column STRING, row_number int64, out result int64) 
BEGIN
  EXECUTE IMMEDIATE 'SELECT ' || column || ' from d1.temp where c2 = ?' into result using row_number;
END;

BEGIN
  DECLARE result_c1 INT64;
  
  call d1.GET_VALUE("c1", 1, result_c1);
  
  select result_c1;

END;

经过一些研究和尝试错误的方法后,我使用这个解决方法来解决这个问题。当您有太多的列时,它可能不是最好的解决方案,但它确实有效

CREATE OR REPLACE FUNCTION METADATA.GET_VALUE(column STRING, row_number int64) AS (
(SELECT case 
when column_name = 'a' then a
when column_name = 'b' then b
when column_name = 'c' then c
when column_name = 'd' then d
when column_name = 'e' then e
end from WORK.temp WHERE rownumber = row_number)
);
这就给出了所需的结果

需要注意的是:您在case语句中使用的列数应该是相同的数据类型,否则它将不起作用


在我的情况下,不能保证
结果
将是Int类型,并且看起来我不能在这里使用
任何类型
。我计划在select语句中使用此函数,如
select函数(动态生成的列名,行号)col1,select函数(动态生成的列名,行号)col2
,因此即使我准备了存储过程,也很难使用它。我同意
任何类型的
都不能在存储过程中使用。在这种情况下,此解决方案对您没有帮助。也许其他人会想出更好的解决办法。我也对这个话题感兴趣:)我有一个解决办法。我在下面贴了一个答案。我只是想告诉你,你对这个话题很感兴趣。我很高兴你找到了解决办法。在某些情况下,它可能对我也很有用:)虽然您提供了许多与问题0相关的详细信息,但仍不清楚您的用例到底是什么!请解释一下你想要达到的目标。输入数据和预期输出的示例将极大地帮助我们帮助您:o)