[英]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.