

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Cari nilai dalam array JSON
<a name="searching-for-values"></a>

Untuk menentukan apakah nilai tertentu ada dalam larik dikodekan JSON, gunakan fungsi `json_array_contains`.

Kueri berikut mencantumkan nama-nama pengguna yang berpartisipasi dalam “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')
```

Kueri ini mengembalikan daftar pengguna.

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

Contoh kueri berikut mencantumkan nama pengguna yang telah menyelesaikan proyek bersama dengan jumlah total proyek yang telah selesai. Ini melakukan tindakan ini:
+ Menggunakan pernyataan nested `SELECT` untuk kejelasan.
+ Mengekstraksi larik proyek.
+ Mengonversi larik ke larik asli pasangan nilai kunci menggunakan `CAST`.
+ Mengekstraksi setiap elemen larik menggunakan operator `UNNEST`.
+ Filter memperoleh nilai dengan menyelesaikan proyek dan menghitungnya.

**catatan**  
Saat menggunakan `CAST` untuk `MAP`, Anda dapat menentukan elemen kunci sebagai `VARCHAR` (String asli di Presto), tetapi meninggalkan nilai sebagai JSON, karena nilai-nilai dalam `MAP`adalah dari berbagai tipe: String untuk pasangan nilai kunci pertama, dan Boolean untuk kedua.

```
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
```

Kueri berikut mengembalikan hasil ini:

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