

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

# Menanyakan data bersarang
<a name="query-nested-data"></a>

AWS Clean Rooms menawarkan akses yang kompatibel dengan SQL ke data relasional dan bersarang. 

AWS Clean Rooms menggunakan notasi putus-putus dan subskrip array untuk navigasi jalur saat mengakses data bersarang. Hal ini juga memungkinkan FROM item klausa untuk mengulangi array dan digunakan untuk operasi unnest. Topik berikut memberikan deskripsi pola kueri berbeda yang menggabungkan penggunaan tipe array/struct/map data dengan navigasi jalur dan array, unnesting, dan gabungan.

**Topics**
+ [Navigasi](#navigation)
+ [Kueri yang tidak bersarang](#unnesting-queries)
+ [Semantik longgar](#lax-semantics)
+ [Jenis introspeksi](#types-of-introspection)

## Navigasi
<a name="navigation"></a>

AWS Clean Rooms memungkinkan navigasi ke array dan struktur menggunakan `[...]` braket dan notasi titik masing-masing. Selanjutnya, Anda dapat mencampur navigasi ke dalam struktur menggunakan notasi titik dan array menggunakan notasi braket. 

**Example**  
Misalnya, contoh query berikut mengasumsikan bahwa kolom data `c_orders` array adalah array dengan struktur dan atribut bernama`o_orderkey`.  

```
SELECT cust.c_orders[0].o_orderkey FROM customer_orders_lineitem AS cust;
```

Anda dapat menggunakan notasi titik dan braket di semua jenis kueri, seperti pemfilteran, gabungan, dan agregasi. Anda dapat menggunakan notasi ini dalam kueri di mana biasanya ada referensi kolom. 

**Example**  
Contoh berikut menggunakan pernyataan SELECT yang memfilter hasil.  

```
SELECT count(*) FROM customer_orders_lineitem WHERE c_orders[0].o_orderkey IS NOT NULL;
```

**Example**  
Contoh berikut menggunakan braket dan navigasi titik di kedua klausa GROUP BY dan ORDER BY.  

```
SELECT c_orders[0].o_orderdate,
       c_orders[0].o_orderstatus,
       count(*)
FROM customer_orders_lineitem
WHERE c_orders[0].o_orderkey IS NOT NULL
GROUP BY c_orders[0].o_orderstatus,
         c_orders[0].o_orderdate
ORDER BY c_orders[0].o_orderdate;
```

## Kueri yang tidak bersarang
<a name="unnesting-queries"></a>

Untuk kueri unnest, AWS Clean Rooms aktifkan iterasi melalui array. Hal ini dilakukan dengan menavigasi array menggunakan klausa FROM dari query. 

**Example**  
Menggunakan contoh sebelumnya, contoh berikut iterasi atas nilai atribut untuk`c_orders`.  

```
SELECT o FROM customer_orders_lineitem c, c.c_orders o;
```

Sintaks unnesting adalah perpanjangan dari klausa FROM. Dalam SQL standar, klausa FROM `x (AS) y` berarti bahwa `y` iterasi atas setiap tupel dalam hubungannya. `x` Dalam hal ini, `x` mengacu pada relasi dan `y` mengacu pada alias untuk relasi`x`. Demikian pula, sintaks unnesting menggunakan item klausa FROM `x (AS) y` berarti bahwa `y` iterasi atas setiap nilai dalam ekspresi array. `x` Dalam hal ini, `x` adalah ekspresi array dan `y` merupakan alias untuk`x`.

Operan kiri juga dapat menggunakan notasi titik dan braket untuk navigasi reguler. 

**Example**  
Pada contoh sebelumnya:  
+ `customer_orders_lineitem c`adalah iterasi di atas tabel `customer_order_lineitem` dasar
+ `c.c_orders o`adalah iterasi atas `c.c_orders array`
Untuk mengulangi `o_lineitems` atribut, yang merupakan array dalam array, Anda menambahkan beberapa klausa.



```
SELECT o, l FROM customer_orders_lineitem c, c.c_orders o, o.o_lineitems l;
```

AWS Clean Rooms juga mendukung indeks array saat mengulangi array menggunakan AT kata kunci. Klausa `x AS y AT z` iterasi atas array `x` dan menghasilkan bidang`z`, yang merupakan indeks array. 

**Example**  
Contoh berikut menunjukkan bagaimana indeks array bekerja.  

```
SELECT c_name,
       orders.o_orderkey AS orderkey,
       index AS orderkey_index
FROM customer_orders_lineitem c, c.c_orders AS orders AT index 
ORDER BY orderkey_index;
c_name             | orderkey | orderkey_index
-------------------+----------+----------------
Customer#000008251 | 3020007  |        0
Customer#000009452 | 4043971  |        0  (2 rows)
```

**Example**  
Contoh berikut iterasi atas array skalar.  

```
CREATE TABLE bar AS SELECT json_parse('{"scalar_array": [1, 2.3, 45000000]}') AS data;

SELECT index, element FROM bar AS b, b.data.scalar_array AS element AT index;

 index | element
-------+----------
     0 | 1
1 | 2.3
2 | 45000000
(3 rows)
```

**Example**  
Contoh berikut iterasi atas array dari beberapa level. Contoh menggunakan beberapa klausa unnest untuk beralih ke array terdalam. Sebuah `f.multi_level_array` AS array iterasi. `multi_level_array` Array AS elemen adalah iterasi atas array di dalamnya. `multi_level_array`  

```
CREATE TABLE foo AS SELECT json_parse('[[1.1, 1.2], [2.1, 2.2], [3.1, 3.2]]') AS multi_level_array;

SELECT array, element FROM foo AS f, f.multi_level_array AS array, array AS element;

   array   | element
-----------+---------
 [1.1,1.2] | 1.1
 [1.1,1.2] | 1.2
 [2.1,2.2] | 2.1
 [2.1,2.2] | 2.2
 [3.1,3.2] | 3.1
 [3.1,3.2] | 3.2
(6 rows)
```

## Semantik longgar
<a name="lax-semantics"></a>

Secara default, operasi navigasi pada nilai data bersarang mengembalikan null alih-alih mengembalikan kesalahan saat navigasi tidak valid. Navigasi objek tidak valid jika nilai data bersarang bukan objek atau jika nilai data bersarang adalah objek tetapi tidak berisi nama atribut yang digunakan dalam kueri.

**Example**  
Misalnya, kueri berikut mengakses nama atribut yang tidak valid di kolom data bersarang: `c_orders`  

```
SELECT c.c_orders.something FROM customer_orders_lineitem c;
```

Navigasi array mengembalikan null jika nilai data bersarang bukan array atau indeks array di luar batas. 

**Example**  
Query berikut mengembalikan null `c_orders[1][1]` karena di luar batas.  

```
SELECT c.c_orders[1][1] FROM customer_orders_lineitem c;
```

## Jenis introspeksi
<a name="types-of-introspection"></a>

Kolom tipe data bersarang mendukung fungsi inspeksi yang mengembalikan tipe dan informasi tipe lainnya tentang nilai. AWS Clean Rooms mendukung fungsi boolean berikut untuk kolom data bersarang: 
+ DESIMAL\$1PRESISI
+ SKALA DESIMAL
+ IS\$1ARRAY 
+ IS\$1BIGINT 
+ IS\$1CHAR 
+ ADALAH\$1DESIMAL 
+ IS\$1MENGAPUNG 
+ IS\$1INTEGER 
+ IS\$1OBJEK 
+ IS\$1SKALAR 
+ IS\$1SMALLINT 
+ IS\$1VARCHAR 
+ JSON\$1TYPEOF 

Semua fungsi ini mengembalikan false jika nilai input adalah null. IS\$1SCALAR, IS\$1OBJECT, dan IS\$1ARRAY saling eksklusif dan mencakup semua nilai yang mungkin kecuali untuk null. Untuk menyimpulkan tipe yang sesuai dengan data, AWS Clean Rooms gunakan fungsi JSON\$1TYPEOF yang mengembalikan tipe (tingkat atas) nilai data bersarang seperti yang ditunjukkan pada contoh berikut: 

```
SELECT JSON_TYPEOF(r_nations) FROM region_nations;
 json_typeof
 ------------- 
array
(1 row)
```

```
SELECT JSON_TYPEOF(r_nations[0].n_nationkey) FROM region_nations;
 json_typeof
 -------------
 number
```