標準 SQL を有効にする

このトピックでは、BigQuery データの照会時に標準 SQL を有効にする方法について説明します。

BigQuery ウェブ UI の概要を学習するには、ウェブ UI を使用したクイックスタートをご覧ください。

bq コマンドライン ツールの概要を学習するには、bq コマンドライン ツールを使用したクイック スタートをご覧ください。

useLegacySql オプションの設定

クエリに標準 SQL を使用できるようにするには:

ウェブ UI

  1. BigQuery ウェブ UI を開きます
  2. [クエリを作成] をクリックします。
  3. [オプションを表示] をクリックします。
  4. [レガシー SQL を使用する] チェックボックスをオフにします。

コマンドライン

コマンドラインのステートメントに --use_legacy_sql=false フラグを追加します。

bq query --use_legacy_sql=false "SELECT word FROM `bigquery-public-data.samples.shakespeare`"

C#

BigQuery クライアントのインストールと作成について詳しくは、BigQuery クライアント ライブラリをご覧ください。

クエリを実行するとき、デフォルトでは、標準 SQL が使用されます。

public BigQueryResults AsyncQuery(string projectId, string datasetId, string tableId,
    string query, BigQueryClient client)
{
    var table = client.GetTable(projectId, datasetId, tableId);
    BigQueryJob job = client.CreateQueryJob(query,
        parameters: null,
        options: new QueryOptions { UseQueryCache = false });

    // Wait for the job to complete.
    job.PollUntilCompleted();

    // Then we can fetch the results, either via the job or by accessing
    // the destination table.
    return client.GetQueryResults(job.Reference.JobId);
}

クエリの実行時にレガシー SQL を使用するには、UseLegacySql パラメータを true に設定します。

public BigQueryResults LegacySqlAsyncQuery(string projectId, string datasetId,
    string tableId, string query, BigQueryClient client)
{
    var table = client.GetTable(projectId, datasetId, tableId);
    BigQueryJob job = client.CreateQueryJob(query,
        parameters: null,
        options: new QueryOptions { UseLegacySql = true });

    // Wait for the job to complete.
    job.PollUntilCompleted();

    // Then we can fetch the results, either via the job or by accessing
    // the destination table.
    return client.GetQueryResults(job.Reference.JobId);
}

Go

BigQuery クライアントのインストールと作成について詳しくは、BigQuery クライアント ライブラリをご覧ください。

Go クライアント ライブラリではデフォルトで標準 SQL が使用されます。クエリをレガシーに戻すには、クエリ構成内の UseLegacySQL プロパティを使用します。

q := client.Query(sqlString)
q.UseLegacySQL = true

job, err := q.Run(ctx)
if err != nil {
	return err
}
status, err := job.Wait(ctx)
if err != nil {
	return err
}
if err := status.Err(); err != nil {
	return err
}
it, err := job.Read(ctx)
for {
	var row []bigquery.Value
	err := it.Next(&row)
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Println(row)
}

Java

BigQuery クライアントのインストールと作成について詳しくは、BigQuery クライアント ライブラリをご覧ください。

クエリジョブで標準 SQL 構文を使用するには、useLegacySql パラメータを false に設定します。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // Note that setUseLegacySql is set to false by default
    QueryJobConfiguration.newBuilder(query).setUseLegacySql(false).build();

// Print the results.
for (FieldValueList row : bigquery.query(queryConfig).iterateAll()) {
  for (FieldValue val : row) {
    System.out.printf("%s,", val.toString());
  }
  System.out.printf("\n");
}

Node.js

BigQuery クライアントのインストールと作成について詳しくは、BigQuery クライアント ライブラリをご覧ください。

クエリを実行するときは、useLegacySql パラメータを false に設定して標準 SQL 構文を使用します。

// Imports the Google Cloud client library
const BigQuery = require('@google-cloud/bigquery');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = "your-project-id";
// const sqlQuery = "SELECT * FROM publicdata.samples.natality LIMIT 5;";

// Creates a client
const bigquery = new BigQuery({
  projectId: projectId,
});

// Query options list: https://cloud.google.com/bigquery/docs/reference/v2/jobs/query
const options = {
  query: sqlQuery,
  useLegacySql: false, // Use standard SQL syntax for queries.
};

let job;

// Runs the query as a job
bigquery
  .createQueryJob(options)
  .then(results => {
    job = results[0];
    console.log(`Job ${job.id} started.`);
    return job.promise();
  })
  .then(() => {
    // Get the job's status
    return job.getMetadata();
  })
  .then(metadata => {
    // Check the job's status for errors
    const errors = metadata[0].status.errors;
    if (errors && errors.length > 0) {
      throw errors;
    }
  })
  .then(() => {
    console.log(`Job ${job.id} completed.`);
    return job.getQueryResults();
  })
  .then(results => {
    const rows = results[0];
    console.log('Rows:');
    rows.forEach(row => console.log(row));
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

BigQuery クライアントのインストールと作成について詳しくは、BigQuery クライアント ライブラリをご覧ください。

クエリを実行するときは、useLegacySql パラメータを False に設定して標準 SQL 構文を使用します。

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/**
 * Run a BigQuery query as a job.
 * Example:
 * ```
 * $query = 'SELECT TOP(corpus, 10) as title, COUNT(*) as unique_words ' .
 *          'FROM `bigquery-public-data.samples.shakespeare`';
 * run_query_as_job($projectId, $query, false);
 * ```.
 *
 * @param string $projectId The Google project ID.
 * @param string $query     A SQL query to run. *
 * @param bool $useLegacySql Specifies whether to use BigQuery's legacy SQL
 *        syntax or standard SQL syntax for this query.
 */
function run_query_as_job($projectId, $query, $useLegacySql)
{
    $bigQuery = new BigQueryClient([
        'projectId' => $projectId,
    ]);
    $jobConfig = $bigQuery->query($query)->useLegacySql($useLegacySql);
    $job = $bigQuery->startQuery($jobConfig);

    $backoff = new ExponentialBackoff(10);
    $backoff->execute(function () use ($job) {
        print('Waiting for job to complete' . PHP_EOL);
        $job->reload();
        if (!$job->isComplete()) {
            throw new Exception('Job has not yet completed', 500);
        }
    });
    $queryResults = $job->queryResults();

    $i = 0;
    foreach ($queryResults as $row) {
        printf('--- Row %s ---' . PHP_EOL, ++$i);
        foreach ($row as $column => $value) {
            printf('%s: %s' . PHP_EOL, $column, json_encode($value));
        }
    }
    printf('Found %s row(s)' . PHP_EOL, $i);
}

Python

BigQuery クライアントのインストールと作成について詳しくは、BigQuery クライアント ライブラリをご覧ください。

Python クライアント ライブラリによって実行するクエリでは、デフォルトで標準 SQL 構文が使用されます。

# from google.cloud import bigquery
# client = bigquery.Client()

query = (
    'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
    'WHERE state = "TX" '
    'LIMIT 100')

# Set use_legacy_sql to False to use standard SQL syntax.
# Note that queries run through the Python Client Library are set to use
# standard SQL by default.
job_config = bigquery.QueryJobConfig()
job_config.use_legacy_sql = False

query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location='US',
    job_config=job_config)  # API request - starts the query

# Print the results.
for row in query_job:  # API request - fetches results
    print(row)

クエリ接頭辞の設定

ウェブ UI や REST API、またはクライアント ライブラリの使用時に、クエリに接頭辞を挿入することで、SQL バリアント(レガシー SQL または標準 SQL)を設定できます。

接頭辞 説明
#legacySQL レガシー SQL を使用してクエリを実行します。
#standardSQL 標準 SQL を使用してクエリを実行します。

たとえば、次のクエリをコピーしてウェブ UI に貼り付けると、BigQuery は標準 SQL を使用してクエリを実行し、デフォルトの [レガシー SQL を使用する] オプション設定を無視します。

#standardSQL
SELECT
  weight_pounds, state, year, gestation_weeks
FROM
  `bigquery-public-data.samples.natality`
ORDER BY weight_pounds DESC
LIMIT 10;

useLegacySql オプションを明示的に設定する場合、このオプションは接頭辞と一致していなければなりません。たとえば、ウェブ UI で [Use Legacy SQL] オプションをオフにしている場合、#legacySQL 接頭辞は使用できません。

クエリに設定する #legacySQL#standardSQL の接頭辞:

  • 大文字と小文字は区別されません。
  • クエリの前に挿入する必要があります。
  • 接頭辞とクエリは改行文字で区切る必要があります。

一部のサードパーティ製ツールでは、この接頭辞がサポートされていない場合があります。そのようなツールでは、BigQuery に送信する前にクエリテキストが変更されることがあります。

標準 SQL をコマンドライン ツールのデフォルトとして設定する

コマンドライン ツールの構成ファイル .bigqueryrc を編集することによって、標準 SQL をコマンドライン ツールと対話型シェルのデフォルトの構文として設定できます。

.bigqueryrc の詳細については、コマンド固有フラグのデフォルト値の設定をご覧ください。

.bigqueryrc--use_legacy_sql=false を設定するには:

  1. テキスト エディタで .bigqueryrc を開きます。.bigqueryrc はデフォルトではユーザー ディレクトリにあります(例: $HOME/.bigqueryrc)。

  2. このファイルに次のテキストを追加します。この例では、標準 SQL を、クエリと mk コマンド(ビューの作成時に使用)のデフォルトの構文として設定しています。すでに query または mk コマンドフラグのデフォルト値を構成している場合は、[query] または [mk] を再度追加する必要はありません。

    [query]
    --use_legacy_sql=false
    
    [mk]
    --use_legacy_sql=false
    
  3. ファイルを保存して閉じます。

  4. 対話型シェルを使用している場合は、変更を適用するために、対話型シェルを終了して再起動する必要があります。

利用可能なコマンドライン フラグについては、bq コマンドライン ツール リファレンスをご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

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

ご不明な点がありましたら、Google のサポートページをご覧ください。