執行參數化查詢
使用 GoogleSQL 語法查詢 BigQuery 資料時,您可以運用參數保護使用者輸入內容所做的查詢,避免SQL 注入。參數會取代 GoogleSQL 查詢中的任意運算式。
您可以傳遞各種資料類型的查詢參數,包括:
- 陣列
- 時間戳記
- 結構體
- 範圍
在查詢中傳遞參數
查詢參數僅支援 GoogleSQL 語法。參數無法取代 ID、資料欄名稱、資料表名稱或查詢的其他部分。查詢參數值不得為 NULL。
如要指定具名參數,請使用 @ 字元,後接識別碼,例如 @param_name。或者,您也可以使用預留位置值 ? 指定位置參數。查詢可使用位置或具名參數,但不能同時使用兩者。
您可以在 BigQuery 中透過下列方式執行參數化查詢:
- Google Cloud 控制台中的 BigQuery Studio 查詢編輯器
- bq 指令列工具的
bq query指令 - API
- 用戶端程式庫
以下範例說明如何將參數值傳遞至參數化查詢:
控制台
如要在 Google Cloud 控制台中執行參數化查詢,請在「查詢設定」中設定參數,然後在 SQL 查詢中參照這些參數,方法是在每個參數名稱前面加上 @ 字元。
支援的資料類型: Google Cloud 控制台僅支援原始資料類型的參數化查詢,例如 BIGNUMERIC、BOOL、BYTES、DATE、DATETIME、FLOAT64、GEOGRAPHY、INT64、INTERVAL、NUMERIC、STRING、TIME 或 TIMESTAMP。控制台不支援複雜資料類型,例如 ARRAY 和 STRUCT。 Google Cloud
在 Google Cloud 控制台中新增參數
前往「BigQuery」頁面
在查詢編輯器工具列中,依序點選「編輯」>「查詢設定」。
在「查詢設定」窗格中,找到「查詢參數」部分,然後按一下「新增參數」。
針對查詢中的每個參數,提供下列資訊:
- 名稱:輸入參數名稱 (請勿加入
@字元)。 - 類型:選取參數的資料類型。
- 值:輸入要用於這次執行的值。
- 名稱:輸入參數名稱 (請勿加入
按一下 [儲存]。
在 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參數新增為值為romeoandjuliet的STRING,並將min_word_count參數新增為值為250的INT64。如果查詢缺少參數或參數無效,系統會顯示錯誤訊息。按一下錯誤訊息中的「設定參數」,調整參數設定。
如要在查詢編輯器中執行參數化查詢,請按一下「執行」。
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 會採用 TIMESTAMP 類型的值,格式為 YYYY-MM-DD HH:MM:SS.DDDDDD time_zone。如果您使用用戶端程式庫,請以該語言建立內建日期物件,程式庫會將其轉換為正確格式。詳情請參閱下列各個程式語言的範例。
如要進一步瞭解 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<T>,其中 T
定義結構體內的欄位和型別。欄位定義是以逗號分隔,且格式為 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
如要使用結構體參數,請在查詢工作設定中,將 parameterType 設為 STRUCT。
在作業的 queryParameters 中,為結構體的每個欄位新增物件,
structTypes
。如果結構值是純量,請將 type 設為值的型別,例如 STRING。如果結構體值是陣列,請將此值設為 ARRAY,並將巢狀 arrayType 欄位設為適當的型別。如果 struct 值是設為 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 對話式數據分析中的已驗證參數化查詢。