带有日期列的BigQuery标准SQL表通配符

时间:2017-06-08 22:02:45

标签: google-bigquery standard-sql

使用表通配符时,在BigQuery Web UI中使用日期列时会出现错误,标准SQL中有查询。

这有效:

#standardSQL
SELECT 
  sale_item,
  date_of_sale
FROM `my-project.past_sales.sales_20170601`
limit 100

这不是:

#standardSQL
SELECT 
  sale_item,
  date_of_sale
FROM `my-project.past_sales.sales_*`
WHERE _TABLE_SUFFIX BETWEEN "20170530" AND "20170601"
limit 100

date_of_sale的类型为DATE,而sale_item的类型为STRING。错误是:Error: Invalid adaptation for field: date_of_sale (message Msg_0_CLOUD_QUERY_TABLE). Cannot change from TYPE_STRING to int32

1 个答案:

答案 0 :(得分:2)

这意味着date_of_sale在一个表格中为DATE,在另一个表格中为STRING。你可以通过联盟来找到罪魁祸首:

#standardSQL
SELECT * FROM `my-project.past_sales.sales_20170530` UNION ALL
SELECT * FROM `my-project.past_sales.sales_20170531` UNION ALL
SELECT * FROM `my-project.past_sales.sales_20170601`;

您实际上并不需要运行查询; UI中的验证器将指示不匹配列类型的位置。

要修复错误,您可以重新生成有问题的数据,应用强制转换,也可以使用union运行查询,而不是添加显式强制转换。例如,假设20170531的表格中的列为STRING,您可以执行以下操作:

#standardSQL
SELECT 
  sale_item,
  date_of_sale
FROM (
  SELECT *
  FROM `my-project.past_sales.sales_*`
  WHERE _TABLE_SUFFIX BETWEEN "20170530" AND "20170601" AND
    _TABLE_SUFFIX != 20170531
) UNION ALL
SELECT * REPLACE(CAST(date_of_sale AS DATE) AS date_of_sale)
FROM `my-project.past_sales.sales_20170531`
LIMIT 100;