设置 Big Query 变量,例如 mysql

Setting Big Query variables like mysql

bigquery 等同于 mysql 变量是什么?

SET @fromdate = '2014-01-01 00:00:00',  -- dates for after 2013
@todate='2015-01-01 00:00:00',

@bfromdate = '2005-01-01 00:00:00', -- dates for before 2013
@btodate = '2005-01-01 00:00:00',

@achfromdate  = '2013-01-01 00:00:00', -- dates for ACH without submit time in 2013
@achtodate  = '2013-01-01 00:00:00',

@currency="USD";

BigQuery 中没有要设置的 'variables',但您可以添加功能请求:https://code.google.com/p/google-bigquery/issues/list?q=label:Feature-Request

您可能需要考虑查看 BigQuery 的参数化查询。 BigQuery 支持查询参数,以在使用用户输入构建查询时帮助防止 SQL 注入。此功能仅适用于标准 SQL 语法。

https://cloud.google.com/bigquery/docs/parameterized-queries

您可以使用 WITH 子句。这并不理想,但它完成了工作。

-- Set your variables here
WITH vars AS (
  SELECT '2018-01-01' as from_date,
         '2018-05-01' as to_date
)

-- Then use them by pulling from vars with a SELECT clause
SELECT *
FROM   your_table 
WHERE  date_column BETWEEN
          CAST((SELECT from_date FROM vars) as date)
          AND
          CAST((SELECT to_date FROM vars) as date)

或者更不罗嗦:

#standardSQL
-- Set your variables here
WITH vars AS (
  SELECT DATE '2018-01-01' as from_date,
         DATE '2018-05-01' as to_date
)
-- Then use them by pulling from vars with a SELECT clause
SELECT *
FROM your_table, vars 
WHERE date_column BETWEEN from_date AND to_date

这是使用 a user defined function 的解决方案。声明变量并调用它们看起来更像 Mysql.

您可以这样使用函数 var("your variable name") 调用您的变量:

#standardSQL
-- Set your variables here
CREATE TEMP FUNCTION var(str STRING)
RETURNS STRING
LANGUAGE js AS """
  var result = {
    'fromdate': '2014-01-01 00:00:00',  // dates for after 2013
    'todate': '2015-01-01 00:00:00',

    'bfromdate': '2005-01-01 00:00:00', // dates for before 2013
    'btodate': '2005-01-01 00:00:00',

    'achfromdate': '2013-01-01 00:00:00', // dates for ACH without submit time in 2013
    'achtodate': '2013-01-01 00:00:00',

    'currency': 'USD',

    'minimumamount': '3.50',

    'default': 'undefined'
  };
  return result[str] || result['default'];
""";
-- Then use them by using the function var("your variable name")
SELECT *
FROM your_table
WHERE date_column BETWEEN var("fromdate") AND var("todate")

如果您的变量不是字符串,请将其设置为字符串,使用 var 调用它并 safe_cast 将其设置为您的类型:

#standardSQL

CREATE TEMP FUNCTION var(str STRING)
RETURNS STRING
LANGUAGE js AS """
  var result = {
    'minimumamount': '3.50',
    'default': 'undefined'
  };
  return result[str] || result['default'];
""";

SELECT *
FROM your_table
WHERE amount > safe_cast(var("minimumamount") AS FLOAT64)

您现在可以在 BigQuery 中使用变量。要 运行 您提供的语句,您需要使用 DECLARE:

DECLARE fromdate TIMESTAMP DEFAULT '2014-01-01 00:00:00';  -- dates for after 2013
DECLARE todate TIMESTAMP DEFAULT '2015-01-01 00:00:00';

DECLARE bfromdate TIMESTAMP DEFAULT '2005-01-01 00:00:00'; -- dates for before 2013
DECLARE btodate TIMESTAMP DEFAULT '2005-01-01 00:00:00';

DECLARE achfromdate TIMESTAMP DEFAULT '2013-01-01 00:00:00'; -- dates for ACH without submit time in 2013
DECLARE achtodate TIMESTAMP DEFAULT '2013-01-01 00:00:00';

DECLARE currency STRING DEFAULT "USD";

您可以在声明变量后在语句中使用它们,例如:

DECLARE fromdate TIMESTAMP DEFAULT '2014-01-01 00:00:00';  -- dates for after 2013
DECLARE todate TIMESTAMP DEFAULT '2015-01-01 00:00:00';

SELECT FORMAT('From %t to %t', fromdate, todate);

另见 scripting documentation