

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ネストされたデータのクエリ
<a name="query-nested-data"></a>

AWS Clean Rooms は、リレーショナルデータとネストされたデータへの SQL 互換アクセスを提供します。

AWS Clean Rooms は、ネストされたデータにアクセスするときに、パスナビゲーションにドット表記と配列サブスクリプトを使用します。また、FROM 句の項目で配列を反復処理し、ネスト解除の操作に使用することもできます。以下のトピックでは、パスおよび配列のナビゲーション、ネスト解除、または結合を、配列/構造体/マップデータ型で行う場合の、さまざまなクエリパターンについて説明します。

**Topics**
+ [ナビゲーション](#navigation)
+ [ネストされていないクエリ](#unnesting-queries)
+ [Lax のセマンティクス](#lax-semantics)
+ [内観の種類](#types-of-introspection)

## ナビゲーション
<a name="navigation"></a>

AWS Clean Rooms では、それぞれ`[...]`角括弧表記とドット表記を使用して、配列と構造へのナビゲーションが可能になります。さらに、ドット表記を使用して構造体に、角括弧表記を使用して配列にナビゲーションを混在させることができます。

**Example**  
例えば、次のクエリ例は、`c_orders` 配列データ列が構造体を持つ配列であり、属性の名前が `o_orderkey` であると仮定しています。  

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

フィルタリング、結合、集約など、すべてのタイプのクエリでドットと角括弧の表記を使用できます。この表記は、通常の場合に列参照を含んでいるクエリで使用します。

**Example**  
次の例では、結果をフィルタリングする SELECT ステートメントを使用します。  

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

**Example**  
次の例では、GROUP BY 句と 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;
```

## ネストされていないクエリ
<a name="unnesting-queries"></a>

クエリのネストを解除するために、 は配列の反復 AWS Clean Rooms を有効にします。このために、クエリの FROM 句を使用して配列上をナビゲートします。

**Example**  
前の例を使用して、次の例では、属性値 `c_orders` を繰り返し処理しています。  

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

ネスト解除構文は、FROM 句の拡張です。標準 SQL では、FROM 句 `x (AS) y` は `x` と関連する各タプルを `y` が反復処理することを意味します。この場合、`x` は関連を指し、`y` はその関連 `x` のためのエイリアスを指します。同様に、FROM 句の項目 `x (AS) y` を使用してネスト解除する構文では、`y` が配列式 `x` 内の各値を反復処理することを意味します。この場合、`x` は配列式であり、`y` は `x` のエイリアスです。

左のオペランドは、通常のナビゲーションのためにドットと角括弧の表記を使用することもできます。

**Example**  
前の例で見てみましょう。  
+ `customer_orders_lineitem c` は `customer_order_lineitem` ベーステーブルの反復処理
+ `c.c_orders o` は `c.c_orders array` の反復処理
配列内の配列である `o_lineitems` 属性を反復処理するには、複数の句を追加する必要があります。



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

AWS Clean Rooms は、 ATキーワードを使用して配列を反復処理するときに配列インデックスもサポートします。句 `x AS y AT z` は、配列 `x` を反復処理し、配列インデックスとしてフィールド `z` を生成します。

**Example**  
次の例は、配列インデックスがどのように機能するかを示しています。  

```
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**  
次の例では、スカラー配列の繰り返し処理を行います。  

```
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**  
次の例では、複数のレベルの配列を繰り返し処理します。この例では、複数の UNNEST 句を使用して、最も内側の配列を反復処理します。`f.multi_level_array` AS array は `multi_level_array` を反復処理します。array AS element は、`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)
```

## Lax のセマンティクス
<a name="lax-semantics"></a>

デフォルトでは、ネストされたデータ値に対するナビゲーションオペレーションでナビゲーションが無効である場合、エラーを返す代わりに null を返します。ネストされたデータ値がオブジェクトでない場合、またはネストされたデータ値がオブジェクトであるが、クエリで使用される属性名が含まれていない場合、オブジェクトのナビゲーションは無効です。

**Example**  
例えば、次のクエリは、ネストされたデータ列の `c_orders` で無効な属性名にアクセスします。  

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

ネストされたデータ値が配列でない場合、または配列インデックスが範囲外の場合、配列ナビゲーションは null を返します。

**Example**  
次のクエリは、`c_orders[1][1]` が範囲外であるため、null を返します。  

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

## 内観の種類
<a name="types-of-introspection"></a>

ネストされたデータ型の列は、値に関する型およびその他の型情報を返す検査関数をサポートします。AWS Clean Rooms は、ネストされたデータ列に対して次のブール関数をサポートしています。
+ DECIMAL\$1PRECISION
+ DECIMAL\$1SCALE
+ IS\$1ARRAY 
+ IS\$1BIGINT 
+ IS\$1CHAR 
+ IS\$1DECIMAL 
+ IS\$1FLOAT 
+ IS\$1INTEGER 
+ IS\$1OBJECT 
+ IS\$1SCALAR 
+ IS\$1SMALLINT 
+ IS\$1VARCHAR 
+ JSON\$1TYPEOF 

入力値が null の場合、これらの関数はすべて false を返します。IS\$1SCALAR、IS\$1OBJECT、および IS\$1ARRAY は相互に排他的であり、null を除くすべての可能な値をカバーします。データに対応する型を推測するために、 は、次の例に示すように、ネストされたデータ値の型 (最上位レベル) を返す JSON\$1TYPEOF 関数 AWS Clean Rooms を使用します。

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