執行參數化查詢
BigQuery 的參數化查詢可讓您直接將任意運算式替換為 GoogleSQL 陳述式。傳遞陣列、時間戳記、結構體和範圍等資料類型的參數,可讓您安全地執行使用者輸入內容產生的查詢,同時協助保護資料,防範 SQL 注入攻擊。
限制
- 查詢參數僅適用於 GoogleSQL 語法。
- 參數無法用來替代 ID、資料欄名稱、資料表名稱或查詢的其他部分。
- 查詢參數值不得為
NULL。
在查詢中傳遞參數
如要指定具名參數,請使用 @ 字元,後接ID,例如 @param_name。或者,您也可以使用預留位置值 ? 指定位置參數。查詢可以使用位置參數或具名參數,但不能同時使用。
您可以在 BigQuery 中透過下列方式執行參數化查詢:
- Google Cloud 控制台中的 BigQuery Studio 查詢編輯器
- bq 指令列工具的
bq query指令 - API
- 用戶端程式庫
以下範例說明如何將參數值傳遞至參數化查詢:
控制台
如要在 Google Cloud 控制台執行參數化查詢,請在「Query settings」(查詢設定) 中設定參數,然後在 SQL 查詢中參照這些參數,方法是在每個參數名稱前加上 @ 字元。
支援的資料類型: Google Cloud 控制台僅支援原始資料類型的參數化查詢,例如 BIGNUMERIC、BOOL、BYTES、DATE、DATETIME、FLOAT64、GEOGRAPHY、INT64、INTERVAL、NUMERIC、STRING、TIME 或 TIMESTAMP。 Google Cloud 控制台不支援複雜的資料類型,例如ARRAY和STRUCT。
在 Google Cloud 控制台中新增參數
前往「BigQuery」頁面
在查詢編輯器工具列中,依序點選「編輯」>「查詢設定」。
在「Query settings」(查詢設定) 窗格中,找出「Query parameters」(查詢參數) 部分,然後按一下「Add parameter」(新增參數)。
請為查詢中的每個參數提供下列資訊:
- 名稱:輸入參數名稱 (請勿加入
@字元)。 - 類型:選取參數的資料類型。
- 值:輸入要用於這項執行的值。
- 名稱:輸入參數名稱 (請勿加入
按一下 [儲存]。
在 Google Cloud 控制台中將參數值傳遞至查詢
在查詢編輯器中,使用上一步設定的參數輸入 SQL 查詢。如要參照這些資源,請在名稱前加上
@字元,如範例所示。範例:
SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;在本範例中,您會將
corpus參數新增為STRING,值為romeoandjuliet,並將min_word_count參數新增為INT64,值為250。如果查詢缺少參數或參數無效,系統會顯示錯誤訊息。按一下錯誤訊息中的「Set parameter」(設定參數),調整參數設定。
如要在查詢編輯器中執行參數化查詢,請按一下「Run」(執行)。
bq
-
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
請使用
--parameter,以name:type:value的格式來提供參數的值。如果名稱留空,則會產生位置參數。您可以省略類型,系統會假設為STRING。--parameter旗標必須與--use_legacy_sql=false旗標搭配使用,才能指定 GoogleSQL 語法。(選用) 使用
--location旗標指定位置。bq query \ --use_legacy_sql=false \ --parameter=corpus::romeoandjuliet \ --parameter=min_word_count:INT64:250 \ 'SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;'
API
如要使用具名參數,請在 query 工作設定中將 parameterMode 設為 NAMED。
請利用 query 工作設定中的參數清單填入 queryParameters。請利用查詢中所用的 @param_name 來設定每個參數的 name。
將 useLegacySql 設為 false,啟用 GoogleSQL 語法。
{
"query": "SELECT word, word_count FROM `bigquery-public-data.samples.shakespeare` WHERE corpus = @corpus AND word_count >= @min_word_count ORDER BY word_count DESC;",
"queryParameters": [
{
"parameterType": {
"type": "STRING"
},
"parameterValue": {
"value": "romeoandjuliet"
},
"name": "corpus"
},
{
"parameterType": {
"type": "INT64"
},
"parameterValue": {
"value": "250"
},
"name": "min_word_count"
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
在 Google APIs Explorer 中嘗試這個範例。
如要使用位置參數,請在 query 工作設定中將 parameterMode 設為 POSITIONAL。
C#
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 C# 設定操作說明進行操作。詳情請參閱 BigQuery C# API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
如要使用具名參數:在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 C# 設定操作說明進行操作。詳情請參閱 BigQuery C# API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
如要使用位置參數:Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
如要使用具名參數:Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
如要使用具名參數:Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
如要使用具名參數:Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
如要使用具名參數:在參數化查詢中使用陣列
如要在查詢參數中使用陣列類型,請將類型設為 ARRAY<T>,其中 T 是陣列中元素的類型。請將值建構為以方括號括住的元素清單,其中的元素以逗號分隔,例如 [1, 2,
3]。
如要進一步瞭解陣列類型,請參閱資料類型參考資料。
控制台
Google Cloud 控制台不支援參數化查詢中的陣列。
bq
-
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
這項查詢會選取美國各州最常見的男嬰名字,開頭為字母 W:
bq query \ --use_legacy_sql=false \ --parameter='gender::M' \ --parameter='states:ARRAY<STRING>:["WA", "WI", "WV", "WY"]' \ 'SELECT name, SUM(number) AS count FROM `bigquery-public-data.usa_names.usa_1910_2013` WHERE gender = @gender AND state IN UNNEST(@states) GROUP BY name ORDER BY count DESC LIMIT 10;'
請務必用單引號括住陣列類型宣告,以免指令輸出意外由
>字元重新導向至檔案。
API
如要使用陣列值參數,請在 query 工作設定中,將 parameterType 設為 ARRAY。
如果陣列值是純量,請將 parameterType 設定為值的類型,例如 STRING。如果陣列值是結構,請將參數類型設定為 STRUCT,並將所需的欄位定義新增至 structTypes。
舉例來說,這項查詢會選取美國各州 (名稱開頭為字母 W) 最常見的男嬰名字。
{
"query": "SELECT name, sum(number) as count\nFROM `bigquery-public-data.usa_names.usa_1910_2013`\nWHERE gender = @gender\nAND state IN UNNEST(@states)\nGROUP BY name\nORDER BY count DESC\nLIMIT 10;",
"queryParameters": [
{
"parameterType": {
"type": "STRING"
},
"parameterValue": {
"value": "M"
},
"name": "gender"
},
{
"parameterType": {
"type": "ARRAY",
"arrayType": {
"type": "STRING"
}
},
"parameterValue": {
"arrayValues": [
{
"value": "WA"
},
{
"value": "WI"
},
{
"value": "WV"
},
{
"value": "WY"
}
]
},
"name": "states"
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
C#
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 C# 設定操作說明進行操作。詳情請參閱 BigQuery C# API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
在參數化查詢中使用時間戳記
如要在查詢參數中使用時間戳記,基礎 REST API 會採用 YYYY-MM-DD HH:MM:SS.DDDDDD time_zone 格式的 TIMESTAMP 類型值。如果您使用用戶端程式庫,請以該語言建立內建日期物件,程式庫會將其轉換為正確格式。詳情請參閱下列各程式語言的範例。
如要進一步瞭解 TIMESTAMP 類型,請參閱資料類型參考資料。
控制台
請按照本文前述步驟,在 Google Cloud 控制台中新增參數。選取 TIMESTAMP 做為參數類型,並以 YYYY-MM-DD HH:MM:SS.DDDDDD time_zone 格式輸入時間戳記值。
bq
-
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
這項查詢會將時間戳記參數值加上一小時:
bq query \ --use_legacy_sql=false \ --parameter='ts_value:TIMESTAMP:2016-12-07 08:00:00' \ 'SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);'
API
如要使用時間戳記參數,請在查詢工作設定中將 parameterType 設為 TIMESTAMP。
下列查詢會把一小時加到時間戳記參數值中。
{
"query": "SELECT TIMESTAMP_ADD(@ts_value, INTERVAL 1 HOUR);",
"queryParameters": [
{
"name": "ts_value",
"parameterType": {
"type": "TIMESTAMP"
},
"parameterValue": {
"value": "2016-12-07 08:00:00"
}
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
C#
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 C# 設定操作說明進行操作。詳情請參閱 BigQuery C# API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
在參數化查詢中使用 struct
如要在查詢參數中使用 struct,請將類型設為 STRUCT<T>,其中 T 定義 struct 中的欄位和類型。欄位定義是以逗號分隔,且格式為 field_name TF,其中 TF 是欄位的類型。舉例來說,STRUCT<x INT64, y STRING> 定義的結構包含名為 x 的 INT64 類型欄位,以及名為 y 的 STRING 類型欄位。
如要進一步瞭解 STRUCT 類型,請參閱資料類型參考資料 。
控制台
Google Cloud 控制台不支援參數化查詢中的結構體。
bq
-
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
這項簡單的查詢會傳回參數值,示範結構化類型的用法:
bq query \ --use_legacy_sql=false \ --parameter='struct_value:STRUCT<x INT64, y STRING>:{"x": 1, "y": "foo"}' \ 'SELECT @struct_value AS s;'
API
如要使用 struct 參數,請在查詢工作設定中將 parameterType 設為 STRUCT。
在工作的 queryParameters 中,為 struct 的每個欄位新增物件至 structTypes。如果 struct 值是純量,請將 type 設為值的類型,例如 STRING。如果 struct 值為陣列,請將此值設為 ARRAY,並將巢狀 arrayType 欄位設為適當的類型。如果 struct 值是結構,請將 type 設為 STRUCT,並新增所需的 structTypes。
下列的一般查詢會示範,如何藉由傳回參數值來使用結構類型。
{
"query": "SELECT @struct_value AS s;",
"queryParameters": [
{
"name": "struct_value",
"parameterType": {
"type": "STRUCT",
"structTypes": [
{
"name": "x",
"type": {
"type": "INT64"
}
},
{
"name": "y",
"type": {
"type": "STRING"
}
}
]
},
"parameterValue": {
"structValues": {
"x": {
"value": "1"
},
"y": {
"value": "foo"
}
}
}
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
C#
Go
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Go 設定操作說明進行操作。詳情請參閱 BigQuery Go API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Java
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Java 設定操作說明進行操作。詳情請參閱 BigQuery Java API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Node.js
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Node.js 設定操作說明進行操作。詳情請參閱 BigQuery Node.js API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
Python
在試用這個範例之前,請先按照「使用用戶端程式庫的 BigQuery 快速入門導覽課程」中的 Python 設定操作說明進行操作。詳情請參閱 BigQuery Python API 參考文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
在參數化查詢中使用範圍
如要在查詢參數中使用範圍,請將 type 欄位設為 RANGE。
如要進一步瞭解 RANGE 類型,請參閱資料類型參考資料 。
控制台
Google Cloud 控制台不支援參數化查詢中的範圍。
bq
-
在 Google Cloud 控制台啟用 Cloud Shell。
Google Cloud 控制台底部會開啟 Cloud Shell 工作階段,並顯示指令列提示。Cloud Shell 是已安裝 Google Cloud CLI 的殼層環境,並已設定適用於您目前專案的值。工作階段可能要幾秒鐘的時間才能初始化。
這項查詢會傳回參數值,示範範圍類型的用法:
bq query \ --use_legacy_sql=false \ --parameter='my_param:RANGE<DATE>:[2020-01-01, 2020-12-31)' \ 'SELECT @my_param AS foo;'
API
如要使用範圍參數,請在 parameterType 中將 type 欄位設為 RANGE,並將 rangeElementType 欄位設為要使用的範圍類型。
這項查詢會傳回參數值,說明如何使用 RANGE 參數類型。
{
"query": "SELECT @my_param AS value_of_range_parameter;",
"queryParameters": [
{
"name": "range_param",
"parameterType": {
"type": "RANGE",
"rangeElementTYpe": {
"type": "DATE"
}
},
"parameterValue": {
"rangeValue": {
"start": {
"value": "2020-01-01"
},
"end": {
"value": "2020-12-31"
}
}
}
}
],
"useLegacySql": false,
"parameterMode": "NAMED"
}
後續步驟
- 瞭解 BigQuery 對話式數據分析中的已驗證參數化查詢。