搜尋 JSON 陣列中的值 - Amazon Athena

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

搜尋 JSON 陣列中的值

若要判斷特定的值是否存在 JSON 編碼陣列內,請使用 json_array_contains 函數。

以下查詢列出參與 "project2" 的使用者名稱。

WITH dataset AS ( SELECT * FROM (VALUES (JSON '{"name": "Bob Smith", "org": "legal", "projects": ["project1"]}'), (JSON '{"name": "Susan Smith", "org": "engineering", "projects": ["project1", "project2", "project3"]}'), (JSON '{"name": "Jane Smith", "org": "finance", "projects": ["project1", "project2"]}') ) AS t (users) ) SELECT json_extract_scalar(users, '$.name') AS user FROM dataset WHERE json_array_contains(json_extract(users, '$.projects'), 'project2')

此查詢會傳回使用者清單。

+-------------+ | user | +-------------+ | Susan Smith | +-------------+ | Jane Smith | +-------------+

以下查詢範例列出已完成專案的使用者名稱,以及完成的專案總數。它會執行下列動作:

  • 使用巢狀 SELECT 陳述式以清楚顯示。

  • 擷取專案陣列。

  • 使用 CAST 將陣列轉換為鍵值對的原生陣列。

  • 使用 UNNEST 運算子擷取每一個陣列元素。

  • 依完成的專案篩選獲得的值並計算總數。

注意

MAP 使用 CAST 時,您可以將索引鍵元素指定為 VARCHAR (Presto 中的原生 String),但值要保持為 JSON,因為 MAP 中的值是不同類型:第一個鍵值對使用 String,第二個使用 Boolean。

WITH dataset AS ( SELECT * FROM (VALUES (JSON '{"name": "Bob Smith", "org": "legal", "projects": [{"name":"project1", "completed":false}]}'), (JSON '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project2", "completed":true}, {"name":"project3", "completed":true}]}'), (JSON '{"name": "Jane Smith", "org": "finance", "projects": [{"name":"project2", "completed":true}]}') ) AS t (users) ), employees AS ( SELECT users, CAST(json_extract(users, '$.projects') AS ARRAY(MAP(VARCHAR, JSON))) AS projects_array FROM dataset ), names AS ( SELECT json_extract_scalar(users, '$.name') AS name, projects FROM employees, UNNEST (projects_array) AS t(projects) ) SELECT name, count(projects) AS completed_projects FROM names WHERE cast(element_at(projects, 'completed') AS BOOLEAN) = true GROUP BY name

此查詢會傳回下列結果:

+----------------------------------+ | name | completed_projects | +----------------------------------+ | Susan Smith | 2 | +----------------------------------+ | Jane Smith | 1 | +----------------------------------+