結構化資料列索引鍵查詢
如果資料表的資料列索引鍵結構定義為結構化資料列索引鍵,您可以使用 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 |