2016-12-07 5 views
1

public BigQuery github_reposデータセットから2つのレコード(ただし、author.name および difference.old_mode)を除くすべてを選択したいとします。同様の質問に基づいて、私は私は私が著者の除外を実行した場合、それがうまく機能BigQuery select * 2つの列を除く

#standardSQL 
SELECT * REPLACE ((SELECT AS STRUCT author.* EXCEPT (name)) AS author), 
REPLACE ((SELECT AS STRUCT difference.* EXCEPT (old_mode)) AS difference) 
FROM `bigquery-public-data.github_repos.commits` 
LIMIT 1000; 

に類似したクエリを実行したいと考え、尋ねた:

#standardSQL 
SELECT * REPLACE ((SELECT AS STRUCT author.* EXCEPT (name)) AS author) 
FROM `bigquery-public-data.github_repos.commits` 
LIMIT 1000; 

しかし、差除外がありエラー:

#standardSQL 
SELECT * REPLACE ((SELECT AS STRUCT difference.* EXCEPT (old_mode)) AS difference) 
FROM `bigquery-public-data.github_repos.commits` 
LIMIT 1000; 

エラー:

Dot-star is not supported for type ARRAY<STRUCT<old_mode INT64, new_mode INT64, old_path STRING, ...>> at [2:41] 

ありがとう。

更新 SQL serverの重複はありません。自己完結型の例として

+0

[SQLはSELECT \ * \ [except columnA \] from tableA?を使用して列を除外できますか?](http://stackoverflow.com/questions/729197/sql-exclude-a-column-using-select- except-columna-from-tablea) – Sam07

+0

ありがとうございます。しかし、そのMS SQLサーバーのリンクは、残念なことにここで私を助けません。 – Spikey

答えて

3

、このクエリを考える:

WITH T AS (
    SELECT 10 AS a, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[ 
     (1, 'foo', true)] AS arr UNION ALL 
    SELECT 11, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[ 
     (2, 'bar', false), (3, 'baz', true)] 
) 
SELECT * FROM T; 

それはタイプINT64のカラムa及びタイプARRAY<STRUCT<x INT64, y STRING, z BOOL>>のカラムarrを返します。あなたは、配列内の構造体がy省略arrの変更を返すしたい場合は、SELECT * REPLACESELECT * EXCEPTの組み合わせ使用することができます

WITH T AS (
    SELECT 10 AS a, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[ 
     (1, 'foo', true)] AS arr UNION ALL 
    SELECT 11, ARRAY<STRUCT<x INT64, y STRING, z BOOL>>[ 
     (2, 'bar', false), (3, 'baz', true)] 
) 
SELECT * REPLACE(ARRAY(SELECT AS STRUCT * EXCEPT (y) FROM UNNEST(arr)) AS arr) 
FROM T; 

アイデアは新しいものと元の配列を交換することですが、我々 および* EXCEPTARRAYサブクエリを使用して、フィールドにyが含まれていない構造要素を含む配列を再構成します。

バック問題のクエリに行く、あなたはdifferenceold_modeに同じ考え方を適用することができますが:

SELECT * REPLACE (
    ARRAY(SELECT AS STRUCT * EXCEPT (old_mode) FROM UNNEST(difference)) AS difference 
) 
FROM `bigquery-public-data.github_repos.commits` 
LIMIT 1000; 

クエリの結果は、その構造体old_modeフィールドが含まれていませんdifference配列が含まれています。

+0

あなたは素晴らしいです。どうもありがとうございます。これを参照する人のために、私の質問でこの例を完成させるためには、Elliottが上で持っていた置換関数に追加したもう一つの置換クエリ行が必要です。これにより、両方のフィールドが正常に削除されます。 – Spikey

+0

素晴らしい答え、これはより多くのポイントを値する方法です。 – hraban

関連する問題