ワイルドカード テーブル

はじめに

ワイルドカード テーブルを利用すると、簡潔な SQL 文を使用して複数のテーブルを照会できます。ワイルドカード テーブルは標準の SQL でのみ使用できます。レガシー SQL でのこれに相当する機能については、テーブル ワイルドカード関数をご覧ください。

ワイルドカード テーブルは、ワイルドカード式に一致するすべてのテーブルが結合されたものを表します。たとえば次の FROM 句は、ワイルドカード式 gsod* を使用しており、noaa_gsod データセット内の gsod という文字列で始まるすべてのテーブルに一致します。

FROM
  `bigquery-public-data.noaa_gsod.gsod*`

ワイルドカード テーブルの各行には、ワイルドカード文字が一致した値を含む特別な列があります。

手順の説明とワイルドカード テーブルを使用したクエリのサンプルについては、ワイルドカード テーブルを使用した複数テーブルの照会をご覧ください。

ワイルドカード テーブルの用途

ワイルドカード テーブルはデータセットに、互換性のあるスキーマを持つ類似した名前のテーブルが複数含まれている場合に便利です。こうしたデータセットには通常、それぞれ単一の日、月、年などのデータを表すテーブルが含まれています。たとえば、BigQuery でホストされているパブリック データセット NOAA 地球表面の気象データの概要には、1929 年から現在に至るまでの各年のテーブルが含まれています。

1929 年から 1940 年までのすべてのテーブル ID をスキャンするクエリは、FROM 句で 12 点すべてのテーブルを指定する必要がある場合、非常に長いものになります(このサンプルでは大半のテーブルを省略しています):

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM (
  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1929` UNION ALL
  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1930` UNION ALL
  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1931` UNION ALL

  # ... Tables omitted for brevity

  SELECT
    *
  FROM
    `bigquery-public-data.noaa_gsod.gsod1940` )
WHERE
  max != 9999.9 # code for missing data
ORDER BY
  max DESC

ワイルドカード テーブルを使用すると、同じクエリがはるかに簡潔になります。

#standardSQL
SELECT
  max,
  ROUND((max-32)*5/9,1) celsius,
  mo,
  da,
  year
FROM
  `bigquery-public-data.noaa_gsod.gsod19*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX BETWEEN '29'
  AND '40'
ORDER BY
  max DESC

ワイルドカード テーブルの構文

ワイルドカード テーブルの構文は次のとおりです。

SELECT
FROM
  `<project-id>.<dataset-id>.<table-prefix>*`
WHERE
  bool_expression
<project-id>
Cloud Platform プロジェクト ID。デフォルトのプロジェクト ID を使用する場合はオプションになります。
<dataset-id>
BigQuery データセット ID。
<table-prefix>
ワイルドカード文字が一致するすべてのテーブルに共通する文字列。テーブル接頭辞はオプションです。テーブル接頭辞を省略すると、データセット内のすべてのテーブルが一致します。テーブル接頭辞の省略については、おすすめの方法をご覧ください。
*(ワイルドカード文字)
ワイルドカード文字「*」は、テーブル名の追加の 1 文字を表します。 ワイルドカード文字はワイルドカード テーブル名の最後の文字としてのみ使用できます。

ワイルドカード テーブルの WHERE 句も、ワイルドカード文字が一致した値を含む _TABLE_SUFFIX 疑似列をサポートしています。_TABLE_SUFFIX を使用すると、比較演算子を使用してクエリをフィルタリングできます。 たとえば、次の WHERE 句は比較演算子を使用しています。

WHERE
  _TABLE_SUFFIX BETWEEN '29' AND '40'

WHERE
  _TABLE_SUFFIX = '1929'

WHERE
  _TABLE_SUFFIX < '1941'

_TABLE_SUFFIX 疑似列の詳細については、選択したテーブルの _TABLE_SUFFIX によるフィルタリングをご覧ください。

ワイルドカードを含むテーブル名をバッククォートで囲む

ワイルドカード テーブル名には特殊文字(*)が含まれているため、ワイルドカード テーブル名はバッククォート(`)文字で囲む必要があります。たとえば次のクエリは、バッククォートを使用しているため有効です。

#standardSQL
/* Valid standard SQL query */
SELECT
  max
FROM
  `bigquery-public-data.noaa_gsod.gsod*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

次のクエリは、正しくバッククォートで囲まれていないため有効ではありません。

#standardSQL
/* Syntax error: Expected end of statement but got "-" at [4:11] */
SELECT
  max
FROM
  # missing backticks
  bigquery-public-data.noaa_gsod.gsod*
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

引用符は機能しません。

#standardSQL
/* Syntax error: Unexpected string literal: 'bigquery-public-data.noaa_gsod.gsod*' at [4:3] */
SELECT
  max
FROM
  # quotes are not backticks
  'bigquery-public-data.noaa_gsod.gsod*'
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX = '1929'
ORDER BY
  max DESC

おすすめの方法

長い接頭辞は通常、短い接頭辞よりもうまく機能します。たとえば、次のクエリでは長い接頭辞(gsod200)を使用しています。

#standardSQL
SELECT
  max
FROM
  `bigquery-public-data.noaa_gsod.gsod200*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX BETWEEN '0' AND '1'
ORDER BY
  max DESC

次のクエリは空の接頭辞を使用しているため、通常あまりうまく機能しません。

#standardSQL
SELECT
  max
FROM
  `bigquery-public-data.noaa_gsod.*`
WHERE
  max != 9999.9 # code for missing data
  AND _TABLE_SUFFIX BETWEEN 'gsod2000' AND 'gsod2001'
ORDER BY
  max DESC
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...