Complex types
R2 SQL supports querying struct, array, and map column types stored in Iceberg tables. This page covers access patterns, supported functions, and examples for each type.
Struct columns contain named fields. Access fields using bracket notation or the get_field() function.
SELECT pricing['price'] AS price, pricing['discount_percent'] AS discountFROM my_namespace.productsLIMIT 5SELECT get_field(pricing, 'price') AS price, get_field(pricing, 'discount_percent') AS discountFROM my_namespace.productsLIMIT 5SELECT customer_id, pricing['price'] AS priceFROM my_namespace.productsWHERE pricing['price'] > 50LIMIT 10SELECT customer_id, pricing['price'] AS priceFROM my_namespace.productsWHERE pricing['price'] IS NOT NULLORDER BY pricing['price'] DESCLIMIT 10SELECT platforms['windows'] AS windows_support, COUNT(*) AS product_count, AVG(pricing['price']) AS avg_priceFROM my_namespace.productsWHERE pricing['price'] IS NOT NULLGROUP BY platforms['windows']-- named_struct creates a struct with named fieldsSELECT named_struct('id', customer_id, 'amount', total_amount) AS infoFROM my_namespace.sales_dataWHERE total_amount IS NOT NULLLIMIT 1
-- struct creates a struct with positional fieldsSELECT struct(customer_id, total_amount, region) AS infoFROM my_namespace.sales_dataWHERE total_amount IS NOT NULLLIMIT 1Array columns contain ordered lists of values. Array indexing is 1-based.
SELECT customer_id, tags[1] AS first_tag, tags[2] AS second_tagFROM my_namespace.productsLIMIT 5Creates an array from a list of values.
SELECT make_array(1, 2, 3) AS numsFROM my_namespace.sales_dataLIMIT 1Splits a string into an array by a delimiter.
SELECT string_to_array(categories, ',') AS cat_arrayFROM my_namespace.productsWHERE categories IS NOT NULLLIMIT 5Generates an array of integers from start (inclusive) to stop (exclusive).
SELECT range(0, 5) AS numsFROM my_namespace.sales_dataLIMIT 1Generates an array of integers from start to stop (inclusive).
SELECT generate_series(1, 5) AS numsFROM my_namespace.sales_dataLIMIT 1Returns the number of elements in an array.
SELECT customer_id, array_length(tags) AS tag_countFROM my_namespace.productsLIMIT 5Returns the total number of elements in an array. Alias for array_length.
SELECT customer_id, cardinality(tags) AS tag_countFROM my_namespace.productsLIMIT 5Returns true if an array has zero elements.
SELECT customer_id, empty(tags) AS has_no_tagsFROM my_namespace.productsLIMIT 5Returns the number of dimensions of an array.
SELECT array_ndims(make_array(1, 2, 3)) AS ndimsFROM my_namespace.sales_dataLIMIT 1Returns the dimensions of an array.
SELECT array_dims(make_array(1, 2, 3)) AS dimsFROM my_namespace.sales_dataLIMIT 1Returns true if an array contains a value.
SELECT customer_id, array_has(tags, 'premium') AS is_premiumFROM my_namespace.productsLIMIT 5Returns true if the first array contains all elements of the second.
SELECT array_has_all(make_array(1, 2, 3, 4), make_array(2, 3)) AS has_allFROM my_namespace.sales_dataLIMIT 1Returns true if the first array contains any element of the second.
SELECT array_has_any(make_array(1, 2, 3), make_array(3, 4, 5)) AS has_anyFROM my_namespace.sales_dataLIMIT 1Returns the position of the first occurrence of a value (1-indexed). Returns 0 if not found.
SELECT array_position(make_array('a', 'b', 'c', 'b'), 'b') AS posFROM my_namespace.sales_dataLIMIT 1Returns all positions of a value as an array.
SELECT array_positions(make_array(1, 2, 1, 3, 1), 1) AS positionsFROM my_namespace.sales_dataLIMIT 1Sorts array elements.
SELECT array_sort(make_array(3, 1, 2)) AS sortedFROM my_namespace.sales_dataLIMIT 1Reverses the order of array elements.
SELECT array_reverse(make_array(1, 2, 3)) AS reversedFROM my_namespace.sales_dataLIMIT 1Removes duplicate elements from an array.
SELECT array_distinct(make_array(1, 2, 2, 3, 3, 3)) AS unique_valsFROM my_namespace.sales_dataLIMIT 1Flattens a nested array by one level.
SELECT flatten(make_array(make_array(1, 2), make_array(3, 4))) AS flatFROM my_namespace.sales_dataLIMIT 1Returns a slice of an array from a start index to an end index (both inclusive, 1-indexed).
SELECT array_slice(make_array(10, 20, 30, 40, 50), 2, 4) AS slicedFROM my_namespace.sales_dataLIMIT 1Appends a value to the end of an array.
SELECT array_append(make_array(1, 2, 3), 4) AS appendedFROM my_namespace.sales_dataLIMIT 1Prepends a value to the beginning of an array.
SELECT array_prepend(0, make_array(1, 2, 3)) AS prependedFROM my_namespace.sales_dataLIMIT 1Concatenates two or more arrays.
SELECT array_concat(make_array(1, 2), make_array(3, 4)) AS mergedFROM my_namespace.sales_dataLIMIT 1Removes the first occurrence of a value from an array.
SELECT array_remove(make_array(1, 2, 3, 2), 2) AS resultFROM my_namespace.sales_dataLIMIT 1Removes all occurrences of a value from an array.
SELECT array_remove_all(make_array(1, 2, 3, 2, 2), 2) AS resultFROM my_namespace.sales_dataLIMIT 1Removes the first n occurrences of a value from an array.
SELECT array_remove_n(make_array(1, 2, 2, 2, 3), 2, 2) AS resultFROM my_namespace.sales_dataLIMIT 1Replaces the first occurrence of a value in an array.
SELECT array_replace(make_array(1, 2, 3), 2, 99) AS resultFROM my_namespace.sales_dataLIMIT 1Replaces the first n occurrences of a value in an array.
SELECT array_replace_n(make_array(1, 2, 2, 2, 3), 2, 99, 2) AS resultFROM my_namespace.sales_dataLIMIT 1Replaces all occurrences of a value in an array.
SELECT array_replace_all(make_array(1, 2, 3, 2), 2, 99) AS resultFROM my_namespace.sales_dataLIMIT 1Removes the last element from an array.
SELECT array_pop_back(make_array(1, 2, 3)) AS resultFROM my_namespace.sales_dataLIMIT 1Removes the first element from an array.
SELECT array_pop_front(make_array(1, 2, 3)) AS resultFROM my_namespace.sales_dataLIMIT 1Repeats a value a given number of times as an array.
SELECT array_repeat(region, 3) AS repeatedFROM my_namespace.sales_dataLIMIT 1Resizes an array to a given length, filling with a default value.
SELECT array_resize(make_array(1, 2), 5, 0) AS resizedFROM my_namespace.sales_dataLIMIT 1Returns elements common to both arrays.
SELECT array_intersect(make_array(1, 2, 3), make_array(2, 3, 4)) AS commonFROM my_namespace.sales_dataLIMIT 1Returns all unique elements from both arrays.
SELECT array_union(make_array(1, 2, 3), make_array(3, 4, 5)) AS mergedFROM my_namespace.sales_dataLIMIT 1Returns elements in the first array that are not in the second.
SELECT array_except(make_array(1, 2, 3, 4), make_array(2, 4)) AS diffFROM my_namespace.sales_dataLIMIT 1Returns the maximum value in an array.
SELECT customer_id, array_max(scores) AS max_scoreFROM my_namespace.productsLIMIT 5Returns the minimum value in an array.
SELECT customer_id, array_min(scores) AS min_scoreFROM my_namespace.productsLIMIT 5Returns the first non-NULL value in an array.
SELECT array_any_value(make_array(NULL, 42, NULL)) AS first_valFROM my_namespace.sales_dataLIMIT 1Returns the element at a given index (1-indexed). Equivalent to bracket-notation access (arr[idx]).
SELECT array_element(make_array(10, 20, 30), 2) AS second_valFROM my_namespace.sales_dataLIMIT 1Joins array elements into a string with a separator.
SELECT customer_id, array_to_string(tags, ', ') AS tag_listFROM my_namespace.productsLIMIT 5Map columns store key-value pairs. Use map_keys, map_values, and map_extract to query them.
Returns all keys from a map as an array.
SELECT map_keys(metadata) AS keysFROM my_namespace.productsLIMIT 5Returns all values from a map as an array.
SELECT map_values(metadata) AS valsFROM my_namespace.productsLIMIT 5Returns the value for a specific key.
SELECT map_extract(metadata, 'source') AS source, map_extract(metadata, 'store_name') AS storeFROM my_namespace.productsLIMIT 5SELECT map(make_array('a', 'b'), make_array(1, 2)) AS mFROM my_namespace.sales_dataLIMIT 1| Function | Description |
|---|---|
struct_col['field'] | Bracket notation field access |
get_field(struct, 'field') | Function-based field access |
named_struct(k1, v1, ...) | Create struct with named fields |
struct(v1, v2, ...) | Create struct with positional fields |
| Function | Description |
|---|---|
make_array(v1, v2, ...) | Create array from values |
string_to_array(str, delim) | Split string into array |
range(start, stop) | Generate integer range (exclusive stop) |
generate_series(start, stop) | Generate integer series (inclusive stop) |
array_length(arr) | Number of elements |
cardinality(arr) | Number of elements |
empty(arr) | True if empty |
array_ndims(arr) | Number of dimensions |
array_dims(arr) | Dimension information |
array_has(arr, val) | Contains check |
array_has_all(arr, arr2) | Contains all check |
array_has_any(arr, arr2) | Contains any check |
array_position(arr, val) | First position of value |
array_positions(arr, val) | All positions of value |
array_sort(arr) | Sort elements |
array_reverse(arr) | Reverse order |
array_distinct(arr) | Remove duplicates |
flatten(arr) | Flatten one level |
array_slice(arr, start, end) | Extract sub-array |
array_append(arr, val) | Append to end |
array_prepend(val, arr) | Prepend to start |
array_concat(arr1, arr2) | Concatenate arrays |
array_remove(arr, val) | Remove first occurrence |
array_remove_all(arr, val) | Remove all occurrences |
array_remove_n(arr, val, n) | Remove first n occurrences |
array_replace(arr, old, new) | Replace first occurrence |
array_replace_n(arr, old, new, n) | Replace first n occurrences |
array_replace_all(arr, old, new) | Replace all occurrences |
array_pop_back(arr) | Remove last element |
array_pop_front(arr) | Remove first element |
array_repeat(val, n) | Repeat value n times |
array_resize(arr, size, default) | Resize with default fill |
array_intersect(arr1, arr2) | Common elements |
array_union(arr1, arr2) | Union of elements |
array_except(arr1, arr2) | Difference of elements |
array_max(arr) | Maximum value |
array_min(arr) | Minimum value |
array_any_value(arr) | First non-NULL value |
array_to_string(arr, delim) | Join elements as string |
array_element(arr, idx) | Element at index |
| Function | Description |
|---|---|
map(keys_arr, vals_arr) | Create map from key and value arrays |
map_keys(map) | All keys as array |
map_values(map) | All values as array |
map_extract(map, key) | Value for a specific key |