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

4

BigQuery标准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


如果您像表名一样引用字段会发生什么? - Nick
2个回答

3
埃利奥特的回答很好,解决了你问题的第一部分,所以让我来回答第二部分(因为它非常不同)。
首先,想提到的是,BigQuery标准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结构中消除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   

“我仍然不清楚如何使用您的建议来删除整个detected_circle.*文件。”
SELECT * EXCEPT(detected_circle)
FROM `bigquery-public-data.eclipse_megamovie.photos_v_0_2` 
LIMIT 10

1
谢谢各位。回答很好,但是我仍然不清楚如何使用您的建议来删除整个detected_circle.*。以下代码返回错误:select * REPLACE ((SELECT AS STRUCT detected_circle.* EXCEPT (radius)) AS detected_circle) from ( select * REPLACE ((SELECT AS STRUCT detected_circle.* EXCEPT (center_y)) AS detected_circle) from ( select * REPLACE ((SELECT AS STRUCT detected_circle.* EXCEPT (center_x)) AS detected_circle) from `bigquery-public-data.eclipse_megamovie.photos_v_0_2` ) ) - Yerachmiel Elimelech Weiss
1
@YerachmielElimelechWeiss - 请查看答案的补充部分。 - Mikhail Berlyant

3

这取决于您想要实现的目标。一种解释是,您想要返回一个名为timeSTRUCT,其中包含一个名为ts的单个字段。如果是这种情况,您可以使用STRUCT运算符构建结果:

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

在BigQuery的用户界面中,它会将结果显示为idtime.ts,其中后者表示ts在名为timeSTRUCT内部。
BigQuery不允许结果中包含有句点的列名,因此如果您运行以下查询,则会收到错误提示:
SELECT
  id,
  time_ts AS `time.ts`
FROM `bigquery-public-data.hacker_news.comments` 
LIMIT 10;

无效的字段名"time.ts"。字段必须仅包含字母、数字和下划线,以字母或下划线开头,长度最多为128个字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接