BigQuery 标准 SQL table 带日期列的通配符
BigQuery standard SQL table wildcards with date columns
我在 BigQuery 网络 UI 中使用日期列时遇到错误,在标准 SQL 中使用 table 通配符进行查询。
这个有效:
#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
在一个 table 中是 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
的 table 的列为 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;
我在 BigQuery 网络 UI 中使用日期列时遇到错误,在标准 SQL 中使用 table 通配符进行查询。
这个有效:
#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
在一个 table 中是 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
的 table 的列为 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;