切換 SQL 方言

本主題說明如何在查詢 BigQuery 資料時設定查詢方言。您可以選擇使用標準 SQL 或舊版 SQL 方言。

想要瞭解如何使用 BigQuery 網頁版 UI 開始查詢資料,請參閱使用網頁版 UI 的快速入門導覽課程

想要瞭解如何使用 bq 指令列工具開始查詢資料,請參閱使用 bq 指令列工具的快速入門導覽課程

變更預設方言

您用來查詢資料的介面會決定哪一種查詢方言為預設值:

  • 在 GCP Console 和用戶端程式庫中,預設值為標準 SQL。
  • 在 BigQuery 傳統網頁版 UI、bq 指令列工具和 REST API 中,預設值為舊版 SQL。

如何切換至其他方言:

主控台

GCP Console 的預設方言是標準 SQL。要將方言變更為舊版 SQL:

  1. 視需要按一下 [Compose new query] (撰寫新查詢),開啟查詢編輯器視窗。

  2. 在查詢編輯器下方,依序點選 [More] (其他選項) > [Query settings] (查詢設定)

  3. 按一下 [Advanced options] (進階選項)

  4. 在「Additional Settings」(其他設定) 部分的「SQL dialect」(SQL 方言) 中,點選 [Legacy] (舊版)。這將為此查詢設定舊版 SQL 選項。當您按下 [Compose new query] (撰寫新查詢) 建立新查詢時,必須再次選取舊版 SQL 選項。

傳統版 UI

BigQuery 傳統網頁版 UI 的預設方言是舊版 SQL。如要將方言變更為標準 SQL:

  1. 在傳統網頁版 UI 中點選 [Compose Query]

  2. 按一下 [Show Options]

  3. 在「SQL Dialect」中,取消勾選 [Use Legacy SQL] 方塊。如此設定在查詢編輯器開啟時使用標準 SQL 選項。如果您關閉查詢編輯器後又重新開啟,則必須再次取消選取舊版 SQL 選項。

CLI

bq 指令列工具中的預設查詢方言為舊版 SQL。如要切換成標準 SQL 方言,請在您的指令列陳述式中加入 --use_legacy_sql=false--nouse_legacy_sql 標記。

例如:

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

C#

在試用這個範例程式之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 C# 設定說明進行操作。詳情請參閱 BigQuery C# API 參考說明文件

根據預設,執行查詢時會使用標準 SQL。


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryQuery
{
    public void Query(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013`
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseQueryCache = false });
        // Wait for the job to complete.
        job.PollUntilCompleted();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}

使用舊版 SQL

如要在執行查詢時使用舊版 SQL,請將「UseLegacySql」參數設為「true」。


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryQueryLegacy
{
    public void QueryLegacy(
        string projectId = "your-project-id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        string query = @"
            SELECT name FROM [bigquery-public-data:usa_names.usa_1910_2013]
            WHERE state = 'TX'
            LIMIT 100";
        BigQueryJob job = client.CreateQueryJob(
            sql: query,
            parameters: null,
            options: new QueryOptions { UseLegacySql = true });
        // Wait for the job to complete.
        job.PollUntilCompleted();
        // Display the results
        foreach (BigQueryRow row in client.GetQueryResults(job.Reference))
        {
            Console.WriteLine($"{row["name"]}");
        }
    }
}

Go

在試行這個範例之前,請按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的 Go 相關設定指示操作。詳情請參閱 BigQuery Go API 參考說明文件

根據預設,Go 用戶端程式庫使用標準 SQL。


q := client.Query(
	"SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` " +
		"WHERE state = \"TX\" " +
		"LIMIT 100")
// Location must match that of the dataset(s) referenced in the query.
q.Location = "US"
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)
}

使用舊版 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 快速入門導覽課程:使用用戶端程式庫中的 Java 相關設定指示操作。詳情請參閱 BigQuery Java API 參考說明文件

根據預設,Java 用戶端程式庫使用標準 SQL。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM `bigquery-public-data.samples.shakespeare` GROUP BY corpus;";
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).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");
}

使用舊版 SQL

useLegacySql 參數設為 true,以在查詢工作中使用舊版 SQL 語法。

// BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
String query = "SELECT corpus FROM [bigquery-public-data:samples.shakespeare] GROUP BY corpus;";
QueryJobConfiguration queryConfig =
    // To use legacy SQL syntax, set useLegacySql to true.
    QueryJobConfiguration.newBuilder(query).setUseLegacySql(true).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 快速入門導覽課程:使用用戶端程式庫中的操作說明設定 Node.js。詳情請參閱 BigQuery Node.js API 參考說明文件

根據預設,Node.js 用戶端程式庫使用標準 SQL。

// Import the Google Cloud client library using default credentials
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
async function query() {
  // Queries the U.S. given names dataset for the state of Texas.

  const query = `SELECT name
    FROM \`bigquery-public-data.usa_names.usa_1910_2013\`
    WHERE state = 'TX'
    LIMIT 100`;

  // For all options, see https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/query
  const options = {
    query: query,
    // Location must match that of the dataset(s) referenced in the query.
    location: 'US',
  };

  // Run the query as a job
  const [job] = await bigquery.createQueryJob(options);
  console.log(`Job ${job.id} started.`);

  // Wait for the query to finish
  const [rows] = await job.getQueryResults();

  // Print the results
  console.log('Rows:');
  rows.forEach(row => console.log(row));
}

使用舊版 SQL

useLegacySql 參數設為 true,以在查詢工作中使用舊版 SQL 語法。

PHP

在嘗試此範例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 PHP 設定說明進行操作。詳情請參閱 BigQuery PHP API 參考說明文件

根據預設,PHP 用戶端程式庫使用標準 SQL。

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

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $query = 'SELECT id, view_count FROM `bigquery-public-data.stackoverflow.posts_questions`';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$jobConfig = $bigQuery->query($query);
$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);

使用舊版 SQL

useLegacySql 參數設為 true,以在查詢工作中使用舊版 SQL 語法。

Python

在嘗試此範例之前,請至 BigQuery 快速入門導覽課程:使用用戶端程式庫,按照 Python 設定說明進行操作。詳情請參閱 BigQuery Python API 參考說明文件

根據預設,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"
)
query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location="US",
)  # API request - starts the query

for row in query_job:  # API request - fetches results
    # Row values can be accessed by field name or index
    assert row[0] == row.name == row["name"]
    print(row)

使用舊版 SQL

use_legacy_sql 參數設為 True,以在查詢工作中使用舊版 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 True to use legacy SQL syntax.
job_config = bigquery.QueryJobConfig()
job_config.use_legacy_sql = True

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)

Ruby

在試行這個範例之前,請先按照 BigQuery 快速入門導覽課程:使用用戶端程式庫中的操作說明設定 Ruby。詳情請參閱 BigQuery Ruby API 參考說明文件

根據預設,Ruby 用戶端程式庫使用標準 SQL。

require "google/cloud/bigquery"

def query
  bigquery = Google::Cloud::Bigquery.new
  sql = "SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` " +
        "WHERE state = 'TX' " +
        "LIMIT 100"

  # Location must match that of the dataset(s) referenced in the query.
  results = bigquery.query sql do |config|
    config.location = "US"
  end

  results.each do |row|
    puts row.inspect
  end
end

在 UI 中使用查詢前置字串

您也可以在 GCP Console 或傳統網頁版 UI 中,透過在查詢中加入 SQL 方言前置字串來設定 SQL 方言。

下列前置字串可用於設定 SQL 方言:

前置字串 說明
#legacySQL 使用舊版 SQL 執行查詢
#standardSQL 使用標準 SQL 執行查詢

當您在 GCP Console 中使用查詢前置字串時,「Query settings」(查詢設定) 中的 [SQL Dialect] (SQL 方言) 選項會停用。

在傳統網頁版 UI 中使用查詢前置字串時,前置字串必須與 [SQL Dialect] 選項相符。例如,在傳統網頁版 UI 中,如果您取消勾選 [Use Legacy SQL] 選項,就不能在查詢中使用 #legacySQL 前置字串。

例如,如果將以下查詢複製並貼到 GCP Console 中,BigQuery 將使用舊版 SQL 執行查詢並忽略預設設定。GCP Console 的預設設定為標準 SQL。

#legacySQL
SELECT
  weight_pounds, state, year, gestation_weeks
FROM
  [bigquery-public-data:samples.natality]
ORDER BY weight_pounds DESC
LIMIT 10;

查詢前置字串 #legacySQL#standardSQL

  • 「不」區分大小寫
  • 必須位於查詢前面
  • 必須以換行字元與查詢分隔

部分第三方工具可能不支援這類前置字串,例如會先修改查詢文字再傳送至 BigQuery。

將標準 SQL 設為指令列工具的預設語法

如要將標準 SQL 設為指令列工具和互動殼層的預設語法,您可以編輯指令列工具的設定檔 .bigqueryrc

如要進一步瞭解 .bigqueryrc,請參閱設定指令專屬標記的預設值相關說明。

如何在 .bigqueryrc 中設定 --use_legacy_sql=false

  1. 在文字編輯器中開啟 .bigqueryrc。根據預設,.bigqueryrc 應位於您的使用者目錄中,例如 $HOME/.bigqueryrc

  2. 在檔案中加入以下文字。本範例會將標準 SQL 設為查詢和 mk 指令 (用於建立資料檢視) 的預設語法。如果您已為 querymk 指令標記設定了預設值,則不必重新加入 [query][mk]

    [query]
    --use_legacy_sql=false
    
    [mk]
    --use_legacy_sql=false
    
  3. 儲存並關閉檔案。

  4. 如果您使用互動殼層,則必須退出並重新啟動,才能套用變更。

如要瞭解可用的指令列標記,請參閱 bq 指令列工具參考資料

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁