

# 配列をフィルタリングする
<a name="filtering-arrays"></a>

フィルタ条件に一致する行のコレクションから配列を作成します。

```
WITH
dataset AS (
  SELECT ARRAY[1,2,3,4,5] AS items
)
SELECT array_agg(i) AS array_items
FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
WHERE i > 3
```

このクエリは以下を返します。

```
+-------------+
| array_items |
+-------------+
| [4, 5]      |
+-------------+
```

配列の各要素に特定の値 (2 など) が含まれているかどうかに基づいて配列をフィルタ処理します。次に例を示します。

```
WITH
dataset AS (
  SELECT ARRAY
  [
    ARRAY[1,2,3,4],
    ARRAY[5,6,7,8],
    ARRAY[9,0]
  ] AS items
)
SELECT i AS array_items FROM dataset
CROSS JOIN UNNEST(items) AS t(i)
WHERE contains(i, 2)
```

このクエリは以下を返します。

```
+--------------+
| array_items  |
+--------------+
| [1, 2, 3, 4] |
+--------------+
```

## `filter` 関数を使用する
<a name="filtering-arrays-filter-function"></a>

```
 filter(ARRAY [list_of_values], boolean_function)
```

`ARRAY` 式で `filter` 関数を使用して、*boolean\$1function* が true となっている *list\$1of\$1values* 内の項目のサブセットである新しい配列を作成できます。`filter` 関数は、*UNNEST* 関数を使用できない場合に役立ちます。

次の例では、配列 `[1,0,5,-1]` 内のゼロより大きい値をフィルタリングします。

```
SELECT filter(ARRAY [1,0,5,-1], x -> x>0)
```

**結果**  
`[1,5]`

次の例では、配列 `[-1, NULL, 10, NULL]` 内の null 以外の値をフィルタリングします。

```
SELECT filter(ARRAY [-1, NULL, 10, NULL], q -> q IS NOT NULL)
```

**結果**  
`[-1,10]`