带有日期列的 BigQuery 标准 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

这意味着

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 中的验证程序将指示不匹配的列类型在哪里。

若要修复此错误,可以重新生成有问题的日期的数据,应用强制转换,也可以使用联合运行查询,改为添加显式强制转换。例如,假设 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;

最新更新