在 BigQuery 的标准 SQL 中使用句点"."



BigQuery Standard SQL似乎不允许使用"。在选择语句中。即使是一个简单的查询(见下文)似乎都失败了。对于包含"字段名称的数据集,这是一个大问题。有一种简单的方法可以避免此问题吗?

select id, time_ts as time.ts from `bigquery-public-data.hacker_news.comments` LIMIT 10

返回错误... Error: Syntax error: Unexpected "." at [1:27]

这也失败了... select * except(detected_circle.center_x ) from [bigquery-public-data:eclipse_megamovie.photos_v_0_2] LIMIT 10

这取决于您要完成的工作。一种解释是您要返回一个名为timeSTRUCT,其中一个名为ts的字段在其中。如果是这样,您可以使用STRUCT操作员来构建结果:

SELECT
  id,
  STRUCT(time_ts AS ts) AS time
FROM `bigquery-public-data.hacker_news.comments` 
LIMIT 10;

在BigQuery UI中,它将显示结果为idtime.ts,其中后者表明tsSTRUCT中,名为time

BigQuery在其名称包含期间的结果中删除列,因此,如果您运行以下查询,您将出现错误:

SELECT
  id,
  time_ts AS `time.ts`
FROM `bigquery-public-data.hacker_news.comments` 
LIMIT 10;

无效的字段名称" time.ts"。字段必须仅包含字母,数字和下划线,从字母或下划线开始,最多为128个字符。

艾略特的答案很棒,并解决了您的问题的第一部分,所以让我解决第二部分(因为它完全不同)

首先,想提到BigQuery Standard SQL(而不是

)支持SELECT * EXCEPT这样的选择修饰符
SELECT * EXCEPT(detected_circle.center_x )
FROM [bigquery-public-data:eclipse_megamovie.photos_v_0_2] 
LIMIT 10

您应该尝试

#standardSQL
SELECT * EXCEPT(detected_circle.center_x )
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2` 
LIMIT 10   

当然,现在我们回到标准SQL中的使用期限

中发行

因此,仅当您尝试从detected_circle struct(无效记录)中消除center_x字段时,才能解释上述代码。从技术上讲,这是有道理的,可以使用以下代码

进行完成。
SELECT * 
  REPLACE(STRUCT(detected_circle.radius, detected_circle.center_y ) AS detected_circle)
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2` 
LIMIT 10   

...我仍然不清楚如何使用您的建议删除整个检测到的_circle。*

SELECT * EXCEPT(detected_circle)
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2` 
LIMIT 10

最新更新