

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

# 搜尋 JSON 陣列中的值
<a name="searching-for-values"></a>

若要判斷特定的值是否存在 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                  |
+----------------------------------+
```