結構化資料列索引鍵查詢

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

後續步驟