2017-12-21 11 views
4

BigQuery標準SQLは期間を許可していないようです。 selectステートメントの中で。単純なクエリ(下記参照)でも失敗するようです。これは、フィールド名に "。"が含まれているデータセットの大きな問題です。この問題を回避する簡単な方法はありますか?期間を使用しています。 " 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

+0

テーブル名を指定したときにフィールドを引用するとどうなりますか? – Nick

答えて

3

それはあなたが達成しようとしているかに依存します。 1つの解釈は、timeという名前のSTRUCTを返すことと、その内部にtsという名前の単一のフィールドがあることです。それは後者がtstimeという名前STRUCT内であることを示しidtime.ts、その結果が表示されます、BigQueryのUIで

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

:その場合は、あなたは結果を構築するためにSTRUCT演算子を使用することができます。

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

無効なフィールド名「time.ts」:あなたは次のクエリを実行する場合は、エラーが発生しますので、

BigQueryは、名前がピリオドを含める結果の列を許可しません。フィールドは文字、数字、アンダースコアのみを含む必要があり、文字またはアンダースコアで始まり、最長で128文字まででなければなりません。

3

エリオットの答え素晴らしいとあなたの質問の最初の部分を扱うので、(それはかなり異なっているように)私はそれの第二の部分に対処しましょう

まず、SELECT * EXCEPTなどの選択修飾子がサポートされていることを言及したかったですBigQueryの標準SQLのためにそう、代わりの

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 
0を試してみまし必要があります

とはもちろん、今、私たちは、あなたがdetected_circle STRUCT(NULL可能で、レコード)からcenter_xフィールドを排除しようとして `のみ解釈できるコードの上に、

だから、標準SQLにピリオドを使用して戻って問題にしています。厳密に言えば、これは理にかなっていると全体detected_circleを削除するには、あなたの推薦を使用する方法を私にはまだ明確ではない...コードの下に

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 

を使用して行うことができます。*

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

ありがとうございます。素晴らしい答えですが、あなたの推奨を使って 'detected_circle全体を削除する方法を私にはまだ明確にしていません。* '以下誤差 ' セレクト*(detected_circle AS))半径(ただし*(AS STRUCT detected_circleを選択します。)から をREPLACE( セレクト*を除き*((AS STRUCT detected_circleを選択します。REPLACE(center_y))を返し)detected_circle ASから ( がselect * REPLACE((AS STRUCT detected_circleを選択します。* EXCEPT(center_x))detected_circle AS) 'から BigQueryの-公開data.eclipse_megamovie.photos_v_0_2' ) ) ' '' –

+1

@YerachmielElimelechWeiss - 答えに追加を見る –

関連する問題