結構化資料列索引鍵查詢
如果資料表的資料列索引鍵結構定義為結構化資料列索引鍵,您可以使用 SQL 查詢資料列索引鍵的個別區隔或資料欄。
持續性 materialized view (包括非同步次要索引) 預設會產生結構化資料列鍵。您也可以為要使用 SQL 查詢的任何 Bigtable 資料表定義結構化資料列鍵,方法是為該資料表建立資料列鍵結構定義。詳情請參閱「管理資料列鍵結構定義」。
金鑰
在沒有結構化資料列索引鍵結構定義的 Bigtable 資料表中,每個資料列都會以單一資料列索引鍵建立索引。使用 SQL 查詢資料表時,資料列鍵是名為 _key 的資料欄,SQL 會將其做為主鍵。這不是虛擬資料欄,因此您對資料表執行 SELECT * 查詢時,系統會傳回 _key 資料欄中的值。
另一方面,在具有資料列鍵結構定義的資料表中,資料列鍵 (主鍵) 是資料列鍵結構定義中所有命名為欄位的資料欄組合。將資料列鍵結構定義新增至資料表時,_key 資料欄會變成虛擬資料欄,也就是說,它不會顯示在 SELECT * 查詢中,但您可以使用 SELECT _key 陳述式明確選取該資料欄。
查詢範例
本節範例假設名為 sales 的資料表具有下列結構定義:
field {
field_name: "user_id"
type: { bytes_type { encoding { raw {} } } }
}
field {
field_name: "purchase_date"
type: { string_type { encoding { utf8_bytes {} } } }
}
field {
field_name: "order_number"
type: { string_type { encoding { utf8_bytes {} } } }
}
encoding {
delimited_bytes { delimiter "#" }
}
sales 資料表包含下列資料。product 資料欄系列有兩個資料欄。
| 資料列索引鍵 | 產品 | |
|---|---|---|
| product_type | product_name | |
| 「user1#2025-05-20#abcd1233」 | 「phone」 | 「iPhone16_pro_max」 |
| 「user1#2025-05-20#abcd1235」 | 「鞋子」 | 「nike_hyperdunk」 |
| 「user2#2025-05-24#defg456」 | 「耳機」 | 「sony_wh_1000mx5」 |
結構化資料列索引鍵查詢結果
由於 sales 資料表具有結構化資料列鍵,如果您使用 SELECT * 陳述式查詢資料表,查詢會將資料列鍵的每個區隔做為個別資料欄傳回。如同對 Bigtable 資料表執行的任何 SQL 查詢,資料欄系列中的資料欄會以對應項表示。
SELECT * from sales
結果如下所示:
| user_id | purchase_date | order_number | 產品 |
|---|---|---|---|
| user1 | 2025-05-20 | 「abcd1233」 | { product_type: "phone", product_name: "iPhone16_pro_max" } |
| user1 | 2025-05-20 | 「abcd1235」 | { product_type: "shoes", product_name: "nike_hyperdunk" } |
| user2 | 2025-05-24 | 「defg456」 | { product_type: "headphones", product_name: "sony_wh_1000mx5" } |
您也可以在查詢中指定資料列鍵資料欄,如下列範例所示:
SELECT
product[product_type] AS product_type,
product[product_name] AS product_name
FROM sales
WHERE user_id = b"user1"
結果如下所示:
| product_type | product_name |
|---|---|
| 「phone」 | 「iphone16_pro_max」 |
| 「鞋子」 | 「nike_hyperdunk」 |
篩選器
您可以使用 SQL 函式,依資料列鍵結構定義資料欄進行篩選。下列範例假設 CURRENT_DATE() 會傳回 2025-05-24:
SELECT
user_id,
product["product_name"] AS product_name
FROM
sales
WHERE
PARSE_DATE("YYYY-MM-DD", purchase_date) = CURRENT_DATE()
AND user_id = b"user2"
結果如下所示:
| user_id | product_name |
|---|---|
| user2 | "sony_wh_1000mx5" |
匯總查詢
以下範例說明如何對結構化資料列鍵欄位使用匯總查詢:
SELECT
user_id,
product[product_type] AS product_type,
count(*) AS count
FROM sales
GROUP BY 1, 2
查詢結果如下:
| user_id | product_type | 數量 |
|---|---|---|
| user1 | 手機 | 1 |
| user1 | 鞋子 | 1 |
| user2 | 耳機 | 1 |
原始資料列索引鍵
如要在具有結構化資料列索引鍵的資料表中擷取原始資料列索引鍵,請在查詢中指定 _key 資料欄。
SELECT
_key, user_id
FROM sales
查詢傳回的結果如下:
| _key | user_id |
|---|---|
| 「user1#2025-05-20#abcd1233」 | user1 |
| 「user1#2025-05-20#abcd1235」 | user1 |
| 「user2#2025-05-24#defg456」 | user2 |