繁体   English   中英

通过列名变量使用列值

[英]Use column value through column name variable

是否可以在 select 语句中使用 function 属性?

我在 BigQuery 中有一个这样的外汇 function,但如果我们可以使用rlfm[<column name>]样式的访问器,它会容易得多

当前方法

CREATE OR REPLACE FUNCTION
  reference.fxFromTo(d TIMESTAMP, fromRegion STRING, toRegion STRING, value FLOAT64)
  RETURNS FLOAT64 AS (
    (SELECT
      CASE fromRegion
        WHEN 'AUD' THEN value / rlfm.AUD
        WHEN 'USD' THEN value / rlfm.USD
        WHEN 'EUR' THEN value / rlfm.EUR
        WHEN 'SGD' THEN value / rlfm.SGD
        WHEN 'CAD' THEN value / rlfm.CAD
        WHEN 'GBP' THEN value / rlfm.GBP
        WHEN 'NZD' THEN value / rlfm.NZD
        ELSE -404
      END AS fx
    FROM reference.fx_monthly as rlfm
    WHERE Date = d)
  );

首选方法

CREATE OR REPLACE FUNCTION
  reference.fxFromTo(d TIMESTAMP, fromRegion STRING, toRegion STRING, value FLOAT64)
  RETURNS FLOAT64 AS (
    (SELECT value / rlfm[fromRegion] AS fx
    FROM reference.fx_monthly AS rlfm
    WHERE Date = d)
  );

您可以考虑在下面使用正则表达式,而不是rlfm[column_name]表示法。

CREATE TEMP TABLE fx_monthly AS
SELECT TIMESTAMP '2023-01-01' Date, 10.0 AUD, 20.0 USD, 30.0 EUR, 40.0 SGD, 50.0 CAD, 60.0 GBP, 70.0 NZD
 UNION ALL
SELECT TIMESTAMP '2023-01-02' Date, 11.1 AUD, 21.2 USD, 31.2 EUR, 41.34 SGD, 51.43 CAD, 61.42 GBP, 71.43 NZD;

CREATE TEMP FUNCTION fxFromTo (d TIMESTAMP, fromRegion STRING, value FLOAT64) 
RETURNS FLOAT64 AS ((
  SELECT value / SAFE_CAST(REGEXP_EXTRACT(TO_JSON_STRING(t), FORMAT('"%s":([0-9.]+)', fromRegion)) AS FLOAT64)
    FROM (
      SELECT * FROM fx_monthly WHERE Date = d 
    ) t
));

SELECT fxFromTo('2023-01-02', 'USD', 100.00);

+-------------------+
|        f0_        |
+-------------------+
| 4.716981132075472 |
+-------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM