Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

複合型

最終更新 Markdown で表示Agent セットアップ

R2 SQL は、Iceberg テーブルに保存した struct、array、map 列型の照会に対応しています。このページでは、各型のアクセス方法、対応関数、例を説明します。


struct

struct 列は名前付きフィールドを持ちます。フィールドへはブラケット記法または get_field() 関数でアクセスします。

ブラケット記法

SELECT pricing['price'] AS price,
       pricing['discount_percent'] AS discount
FROM my_namespace.products
LIMIT 5

get_field 関数

SELECT get_field(pricing, 'price') AS price,
       get_field(pricing, 'discount_percent') AS discount
FROM my_namespace.products
LIMIT 5

WHERE 内の struct フィールド

SELECT customer_id, pricing['price'] AS price
FROM my_namespace.products
WHERE pricing['price'] > 50
LIMIT 10

ORDER BY 内の struct フィールド

SELECT customer_id, pricing['price'] AS price
FROM my_namespace.products
WHERE pricing['price'] IS NOT NULL
ORDER BY pricing['price'] DESC
LIMIT 10

GROUP BY 内の struct フィールド

SELECT platforms['windows'] AS windows_support,
       COUNT(*) AS product_count,
       AVG(pricing['price']) AS avg_price
FROM my_namespace.products
WHERE pricing['price'] IS NOT NULL
GROUP BY platforms['windows']

struct をインラインで作成する

-- named_struct creates a struct with named fields
SELECT named_struct('id', customer_id, 'amount', total_amount) AS info
FROM my_namespace.sales_data
WHERE total_amount IS NOT NULL
LIMIT 1

-- struct creates a struct with positional fields
SELECT struct(customer_id, total_amount, region) AS info
FROM my_namespace.sales_data
WHERE total_amount IS NOT NULL
LIMIT 1

array

array 列は値の順序付きリストです。配列のインデックスは 1 始まり です。

インデックスアクセス

SELECT customer_id, tags[1] AS first_tag, tags[2] AS second_tag
FROM my_namespace.products
LIMIT 5

配列を作成する

make_array

値のリストから配列を作成します。

SELECT make_array(1, 2, 3) AS nums
FROM my_namespace.sales_data
LIMIT 1

string_to_array

区切り文字で文字列を配列に分割します。

SELECT string_to_array(categories, ',') AS cat_array
FROM my_namespace.products
WHERE categories IS NOT NULL
LIMIT 5

range

開始(含む)から終了(含まない)までの整数配列を生成します。

SELECT range(0, 5) AS nums
FROM my_namespace.sales_data
LIMIT 1

generate_series

開始から終了(含む)までの整数配列を生成します。

SELECT generate_series(1, 5) AS nums
FROM my_namespace.sales_data
LIMIT 1

配列を調べる

array_length

配列の要素数を返します。

SELECT customer_id, array_length(tags) AS tag_count
FROM my_namespace.products
LIMIT 5

cardinality

配列の要素の総数を返します。array_length の別名です。

SELECT customer_id, cardinality(tags) AS tag_count
FROM my_namespace.products
LIMIT 5

empty

配列の要素数が 0 なら true を返します。

SELECT customer_id, empty(tags) AS has_no_tags
FROM my_namespace.products
LIMIT 5

array_ndims

配列の次元数を返します。

SELECT array_ndims(make_array(1, 2, 3)) AS ndims
FROM my_namespace.sales_data
LIMIT 1

array_dims

配列の次元情報を返します。

SELECT array_dims(make_array(1, 2, 3)) AS dims
FROM my_namespace.sales_data
LIMIT 1

配列を検索する

array_has

配列に値が含まれていれば true を返します。

SELECT customer_id, array_has(tags, 'premium') AS is_premium
FROM my_namespace.products
LIMIT 5

array_has_all

最初の配列が 2 番目の配列の全要素を含んでいれば true を返します。

SELECT array_has_all(make_array(1, 2, 3, 4), make_array(2, 3)) AS has_all
FROM my_namespace.sales_data
LIMIT 1

array_has_any

最初の配列が 2 番目の配列のいずれかの要素を含んでいれば true を返します。

SELECT array_has_any(make_array(1, 2, 3), make_array(3, 4, 5)) AS has_any
FROM my_namespace.sales_data
LIMIT 1

array_position

値の最初の出現位置を返します(1 始まり)。見つからない場合は 0 を返します。

SELECT array_position(make_array('a', 'b', 'c', 'b'), 'b') AS pos
FROM my_namespace.sales_data
LIMIT 1

array_positions

値のすべての位置を配列で返します。

SELECT array_positions(make_array(1, 2, 1, 3, 1), 1) AS positions
FROM my_namespace.sales_data
LIMIT 1

配列を変換する

array_sort

配列の要素を並べ替えます。

SELECT array_sort(make_array(3, 1, 2)) AS sorted
FROM my_namespace.sales_data
LIMIT 1

array_reverse

配列要素の順序を逆にします。

SELECT array_reverse(make_array(1, 2, 3)) AS reversed
FROM my_namespace.sales_data
LIMIT 1

array_distinct

配列から重複要素を除きます。

SELECT array_distinct(make_array(1, 2, 2, 3, 3, 3)) AS unique_vals
FROM my_namespace.sales_data
LIMIT 1

flatten

入れ子の配列を 1 階層平坦化します。

SELECT flatten(make_array(make_array(1, 2), make_array(3, 4))) AS flat
FROM my_namespace.sales_data
LIMIT 1

array_slice

開始インデックスから終了インデックスまでの配列スライスを返します(どちらも含む、1 始まり)。

SELECT array_slice(make_array(10, 20, 30, 40, 50), 2, 4) AS sliced
FROM my_namespace.sales_data
LIMIT 1

配列を変更する

array_append

配列の末尾に値を追加します。

SELECT array_append(make_array(1, 2, 3), 4) AS appended
FROM my_namespace.sales_data
LIMIT 1

array_prepend

配列の先頭に値を追加します。

SELECT array_prepend(0, make_array(1, 2, 3)) AS prepended
FROM my_namespace.sales_data
LIMIT 1

array_concat

2 つ以上の配列を連結します。

SELECT array_concat(make_array(1, 2), make_array(3, 4)) AS merged
FROM my_namespace.sales_data
LIMIT 1

array_remove

配列から値の最初の出現を除きます。

SELECT array_remove(make_array(1, 2, 3, 2), 2) AS result
FROM my_namespace.sales_data
LIMIT 1

array_remove_all

配列から値のすべての出現を除きます。

SELECT array_remove_all(make_array(1, 2, 3, 2, 2), 2) AS result
FROM my_namespace.sales_data
LIMIT 1

array_remove_n

配列から値の最初の n 件の出現を除きます。

SELECT array_remove_n(make_array(1, 2, 2, 2, 3), 2, 2) AS result
FROM my_namespace.sales_data
LIMIT 1

array_replace

配列内の値の最初の出現を置き換えます。

SELECT array_replace(make_array(1, 2, 3), 2, 99) AS result
FROM my_namespace.sales_data
LIMIT 1

array_replace_n

配列内の値の最初の n 件の出現を置き換えます。

SELECT array_replace_n(make_array(1, 2, 2, 2, 3), 2, 99, 2) AS result
FROM my_namespace.sales_data
LIMIT 1

array_replace_all

配列内の値のすべての出現を置き換えます。

SELECT array_replace_all(make_array(1, 2, 3, 2), 2, 99) AS result
FROM my_namespace.sales_data
LIMIT 1

array_pop_back

配列の末尾の要素を除きます。

SELECT array_pop_back(make_array(1, 2, 3)) AS result
FROM my_namespace.sales_data
LIMIT 1

array_pop_front

配列の先頭の要素を除きます。

SELECT array_pop_front(make_array(1, 2, 3)) AS result
FROM my_namespace.sales_data
LIMIT 1

array_repeat

値を指定回数繰り返した配列を返します。

SELECT array_repeat(region, 3) AS repeated
FROM my_namespace.sales_data
LIMIT 1

array_resize

配列を指定長にリサイズし、不足分をデフォルト値で埋めます。

SELECT array_resize(make_array(1, 2), 5, 0) AS resized
FROM my_namespace.sales_data
LIMIT 1

配列の集合演算

array_intersect

両方の配列に共通する要素を返します。

SELECT array_intersect(make_array(1, 2, 3), make_array(2, 3, 4)) AS common
FROM my_namespace.sales_data
LIMIT 1

array_union

両方の配列の一意な要素をすべて返します。

SELECT array_union(make_array(1, 2, 3), make_array(3, 4, 5)) AS merged
FROM my_namespace.sales_data
LIMIT 1

array_except

最初の配列にあり、2 番目にはない要素を返します。

SELECT array_except(make_array(1, 2, 3, 4), make_array(2, 4)) AS diff
FROM my_namespace.sales_data
LIMIT 1

配列の値を集計する

array_max

配列内の最大値を返します。

SELECT customer_id, array_max(scores) AS max_score
FROM my_namespace.products
LIMIT 5

array_min

配列内の最小値を返します。

SELECT customer_id, array_min(scores) AS min_score
FROM my_namespace.products
LIMIT 5

array_any_value

配列内の最初の非 NULL 値を返します。

SELECT array_any_value(make_array(NULL, 42, NULL)) AS first_val
FROM my_namespace.sales_data
LIMIT 1

array_element

指定インデックスの要素を返します(1 始まり)。ブラケット記法のアクセス(arr[idx])と同等です。

SELECT array_element(make_array(10, 20, 30), 2) AS second_val
FROM my_namespace.sales_data
LIMIT 1

配列を別の型へ変換する

array_to_string

区切り文字で配列要素を文字列に結合します。

SELECT customer_id, array_to_string(tags, ', ') AS tag_list
FROM my_namespace.products
LIMIT 5

map

map 列はキーと値のペアを保存します。照会には map_keysmap_valuesmap_extract を使います。

map_keys

map のすべてのキーを配列で返します。

SELECT map_keys(metadata) AS keys
FROM my_namespace.products
LIMIT 5

map_values

map のすべての値を配列で返します。

SELECT map_values(metadata) AS vals
FROM my_namespace.products
LIMIT 5

map_extract

特定のキーの値を返します。

SELECT map_extract(metadata, 'source') AS source,
       map_extract(metadata, 'store_name') AS store
FROM my_namespace.products
LIMIT 5

map をインラインで作成する

SELECT map(make_array('a', 'b'), make_array(1, 2)) AS m
FROM my_namespace.sales_data
LIMIT 1

関数一覧

struct 関数

Function Description
struct_col['field'] ブラケット記法によるフィールドアクセス
get_field(struct, 'field') 関数によるフィールドアクセス
named_struct(k1, v1, ...) 名前付きフィールドの struct を作成
struct(v1, v2, ...) 位置指定フィールドの struct を作成

array 関数

Function Description
make_array(v1, v2, ...) 値から配列を作成
string_to_array(str, delim) 文字列を配列に分割
range(start, stop) 整数範囲を生成(終了は含まない)
generate_series(start, stop) 整数系列を生成(終了を含む)
array_length(arr) 要素数
cardinality(arr) 要素数
empty(arr) 空なら true
array_ndims(arr) 次元数
array_dims(arr) 次元情報
array_has(arr, val) 含むかの判定
array_has_all(arr, arr2) すべて含むかの判定
array_has_any(arr, arr2) いずれかを含むかの判定
array_position(arr, val) 値の最初の位置
array_positions(arr, val) 値のすべての位置
array_sort(arr) 要素を並べ替え
array_reverse(arr) 順序を逆にする
array_distinct(arr) 重複を除く
flatten(arr) 1 階層平坦化
array_slice(arr, start, end) 部分配列を取り出す
array_append(arr, val) 末尾に追加
array_prepend(val, arr) 先頭に追加
array_concat(arr1, arr2) 配列を連結
array_remove(arr, val) 最初の出現を除く
array_remove_all(arr, val) すべての出現を除く
array_remove_n(arr, val, n) 最初の n 件の出現を除く
array_replace(arr, old, new) 最初の出現を置き換え
array_replace_n(arr, old, new, n) 最初の n 件の出現を置き換え
array_replace_all(arr, old, new) すべての出現を置き換え
array_pop_back(arr) 末尾の要素を除く
array_pop_front(arr) 先頭の要素を除く
array_repeat(val, n) 値を n 回繰り返す
array_resize(arr, size, default) デフォルト値で埋めてリサイズ
array_intersect(arr1, arr2) 共通要素
array_union(arr1, arr2) 要素の和集合
array_except(arr1, arr2) 要素の差集合
array_max(arr) 最大値
array_min(arr) 最小値
array_any_value(arr) 最初の非 NULL 値
array_to_string(arr, delim) 要素を文字列に結合
array_element(arr, idx) インデックス位置の要素

map 関数

Function Description
map(keys_arr, vals_arr) キー配列と値配列から map を作成
map_keys(map) すべてのキーを配列で返す
map_values(map) すべての値を配列で返す
map_extract(map, key) 特定のキーの値

役に立ちましたか?