← R2 SQL / r2-sql / sql-reference
Komplexní typy
R2 SQL umožňuje dotazovat sloupce typu struct, array a map uložené v tabulkách Iceberg. Tato stránka popisuje způsoby přístupu, podporované funkce a příklady pro každý typ.
Structs
Sloupce typu Struct obsahují pojmenovaná pole. K polím přistupujte pomocí notace se závorkami nebo pomocí get_field() .
Notace v hranatých závorkách
SELECT pricing['price'] AS price,
pricing['discount_percent'] AS discount
FROM my_namespace.products
LIMIT 5funkce get_field
SELECT get_field(pricing, 'price') AS price,
get_field(pricing, 'discount_percent') AS discount
FROM my_namespace.products
LIMIT 5Pole struktury v WHERE
SELECT customer_id, pricing['price'] AS price
FROM my_namespace.products
WHERE pricing['price'] > 50
LIMIT 10Pole struktury v ORDER BY
SELECT customer_id, pricing['price'] AS price
FROM my_namespace.products
WHERE pricing['price'] IS NOT NULL
ORDER BY pricing['price'] DESC
LIMIT 10Pole struktury v GROUP BY
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']Vytváření struktur inline
-- 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 1Pole
Sloupce typu pole obsahují seřazené seznamy hodnot. Indexování pole je založeno na 1.
Přístup přes index
SELECT customer_id, tags[1] AS first_tag, tags[2] AS second_tag
FROM my_namespace.products
LIMIT 5Vytváření polí
make_array
Vytvoří pole ze seznamu hodnot.
SELECT make_array(1, 2, 3) AS nums
FROM my_namespace.sales_data
LIMIT 1string_to_array
Rozdělí řetězec na pole podle oddělovače.
SELECT string_to_array(categories, ',') AS cat_array
FROM my_namespace.products
WHERE categories IS NOT NULL
LIMIT 5rozsah
Vygeneruje pole celých čísel od počáteční hodnoty (včetně) do koncové hodnoty (bez).
SELECT range(0, 5) AS nums
FROM my_namespace.sales_data
LIMIT 1generate_series
Vygeneruje pole celých čísel od počáteční do koncové hodnoty (včetně).
SELECT generate_series(1, 5) AS nums
FROM my_namespace.sales_data
LIMIT 1Prozkoumat pole
array_length
Vrací počet prvků v poli.
SELECT customer_id, array_length(tags) AS tag_count
FROM my_namespace.products
LIMIT 5cardinality
Vrací celkový počet prvků v poli. Alias pro array_length.
SELECT customer_id, cardinality(tags) AS tag_count
FROM my_namespace.products
LIMIT 5empty
Vrací true, pokud pole neobsahuje žádné prvky.
SELECT customer_id, empty(tags) AS has_no_tags
FROM my_namespace.products
LIMIT 5array_ndims
Vrací počet rozměrů pole.
SELECT array_ndims(make_array(1, 2, 3)) AS ndims
FROM my_namespace.sales_data
LIMIT 1array_dims
Vrací rozměry pole.
SELECT array_dims(make_array(1, 2, 3)) AS dims
FROM my_namespace.sales_data
LIMIT 1Vyhledávání v polích
array_has
Vrací true, pokud pole obsahuje danou hodnotu.
SELECT customer_id, array_has(tags, 'premium') AS is_premium
FROM my_namespace.products
LIMIT 5array_has_all
Vrací true, pokud první pole obsahuje všechny prvky druhého pole.
SELECT array_has_all(make_array(1, 2, 3, 4), make_array(2, 3)) AS has_all
FROM my_namespace.sales_data
LIMIT 1array_has_any
Vrací true, pokud první pole obsahuje alespoň jeden prvek druhého pole.
SELECT array_has_any(make_array(1, 2, 3), make_array(3, 4, 5)) AS has_any
FROM my_namespace.sales_data
LIMIT 1array_position
Vrací pozici prvního výskytu hodnoty (indexováno od 1). Pokud hodnota není nalezena, vrací 0.
SELECT array_position(make_array('a', 'b', 'c', 'b'), 'b') AS pos
FROM my_namespace.sales_data
LIMIT 1array_positions
Vrátí všechny pozice hodnoty jako pole.
SELECT array_positions(make_array(1, 2, 1, 3, 1), 1) AS positions
FROM my_namespace.sales_data
LIMIT 1Transformace polí
array_sort
Řadí prvky pole.
SELECT array_sort(make_array(3, 1, 2)) AS sorted
FROM my_namespace.sales_data
LIMIT 1array_reverse
Obrátí pořadí prvků v poli.
SELECT array_reverse(make_array(1, 2, 3)) AS reversed
FROM my_namespace.sales_data
LIMIT 1array_distinct
Odstraní duplicitní prvky z pole.
SELECT array_distinct(make_array(1, 2, 2, 3, 3, 3)) AS unique_vals
FROM my_namespace.sales_data
LIMIT 1flatten
Zploští vnořené pole o jednu úroveň.
SELECT flatten(make_array(make_array(1, 2), make_array(3, 4))) AS flat
FROM my_namespace.sales_data
LIMIT 1array_slice
Vrátí výřez pole od počátečního po koncový index (oba indexy jsou včetně, číslováno od 1).
SELECT array_slice(make_array(10, 20, 30, 40, 50), 2, 4) AS sliced
FROM my_namespace.sales_data
LIMIT 1Úprava polí
array_append
Přidá hodnotu na konec pole.
SELECT array_append(make_array(1, 2, 3), 4) AS appended
FROM my_namespace.sales_data
LIMIT 1array_prepend
Vloží hodnotu na začátek pole.
SELECT array_prepend(0, make_array(1, 2, 3)) AS prepended
FROM my_namespace.sales_data
LIMIT 1array_concat
Zřetězí dvě nebo více polí.
SELECT array_concat(make_array(1, 2), make_array(3, 4)) AS merged
FROM my_namespace.sales_data
LIMIT 1array_remove
Odstraní první výskyt hodnoty z pole.
SELECT array_remove(make_array(1, 2, 3, 2), 2) AS result
FROM my_namespace.sales_data
LIMIT 1array_remove_all
Odstraní všechny výskyty hodnoty z pole.
SELECT array_remove_all(make_array(1, 2, 3, 2, 2), 2) AS result
FROM my_namespace.sales_data
LIMIT 1array_remove_n
Odstraní prvních n výskytů hodnoty z pole.
SELECT array_remove_n(make_array(1, 2, 2, 2, 3), 2, 2) AS result
FROM my_namespace.sales_data
LIMIT 1array_replace
Nahradí první výskyt hodnoty v poli.
SELECT array_replace(make_array(1, 2, 3), 2, 99) AS result
FROM my_namespace.sales_data
LIMIT 1array_replace_n
Nahradí první n výskytů hodnoty v poli.
SELECT array_replace_n(make_array(1, 2, 2, 2, 3), 2, 99, 2) AS result
FROM my_namespace.sales_data
LIMIT 1array_replace_all
Nahradí všechny výskyty hodnoty v poli.
SELECT array_replace_all(make_array(1, 2, 3, 2), 2, 99) AS result
FROM my_namespace.sales_data
LIMIT 1array_pop_back
Odstraní poslední prvek z pole.
SELECT array_pop_back(make_array(1, 2, 3)) AS result
FROM my_namespace.sales_data
LIMIT 1array_pop_front
Odstraní první prvek z pole.
SELECT array_pop_front(make_array(1, 2, 3)) AS result
FROM my_namespace.sales_data
LIMIT 1array_repeat
Zopakuje hodnotu zadaný počet opakování a vrátí ji jako pole.
SELECT array_repeat(region, 3) AS repeated
FROM my_namespace.sales_data
LIMIT 1array_resize
Změní velikost pole na zadanou délku a doplní ji výchozí hodnotou.
SELECT array_resize(make_array(1, 2), 5, 0) AS resized
FROM my_namespace.sales_data
LIMIT 1Množinové operace na polích
array_intersect
Vrátí prvky společné oběma polím.
SELECT array_intersect(make_array(1, 2, 3), make_array(2, 3, 4)) AS common
FROM my_namespace.sales_data
LIMIT 1array_union
Vrátí všechny jedinečné prvky z obou polí.
SELECT array_union(make_array(1, 2, 3), make_array(3, 4, 5)) AS merged
FROM my_namespace.sales_data
LIMIT 1array_except
Vrátí prvky prvního pole, které nejsou v druhém poli.
SELECT array_except(make_array(1, 2, 3, 4), make_array(2, 4)) AS diff
FROM my_namespace.sales_data
LIMIT 1Agregace hodnot pole
array_max
Vrací maximální hodnotu v poli.
SELECT customer_id, array_max(scores) AS max_score
FROM my_namespace.products
LIMIT 5array_min
Vrací minimální hodnotu v poli.
SELECT customer_id, array_min(scores) AS min_score
FROM my_namespace.products
LIMIT 5array_any_value
Vrací první hodnotu v poli, která není NULL.
SELECT array_any_value(make_array(NULL, 42, NULL)) AS first_val
FROM my_namespace.sales_data
LIMIT 1array_element
Vrací prvek na dané pozici (indexováno od 1). Odpovídá přístupu pomocí hranatých závorek (arr[idx]).
SELECT array_element(make_array(10, 20, 30), 2) AS second_val
FROM my_namespace.sales_data
LIMIT 1Převod polí
array_to_string
Spojí prvky pole do řetězce pomocí oddělovače.
SELECT customer_id, array_to_string(tags, ', ') AS tag_list
FROM my_namespace.products
LIMIT 5Mapy
Sloupce typu MAP ukládají dvojice klíč-hodnota. Použijte map_keys, map_values, a map_extract k jejich dotazování.
map_keys
Vrátí všechny klíče z mapy jako pole.
SELECT map_keys(metadata) AS keys
FROM my_namespace.products
LIMIT 5map_values
Vrátí všechny hodnoty z mapy jako pole.
SELECT map_values(metadata) AS vals
FROM my_namespace.products
LIMIT 5map_extract
Vrací hodnotu pro zadaný klíč.
SELECT map_extract(metadata, 'source') AS source,
map_extract(metadata, 'store_name') AS store
FROM my_namespace.products
LIMIT 5Vytváření map inline
SELECT map(make_array('a', 'b'), make_array(1, 2)) AS m
FROM my_namespace.sales_data
LIMIT 1Úplný rejstřík funkcí
Funkce pro struktury
| Funkce | Popis |
|---|---|
struct_col['field'] |
Přístup k poli pomocí notace v hranatých závorkách |
get_field(struct, 'field') |
Přístup k poli pomocí funkce |
named_struct(k1, v1, ...) |
Vytvoření struktury s pojmenovanými poli |
struct(v1, v2, ...) |
Vytvoření struktury s pozičními poli |
Funkce pro pole
| Funkce | Popis |
|---|---|
make_array(v1, v2, ...) |
Vytvoření pole z hodnot |
string_to_array(str, delim) |
Rozdělení řetězce na pole |
range(start, stop) |
Generovat rozsah celých čísel (konečná hodnota není zahrnuta) |
generate_series(start, stop) |
Generovat řadu celých čísel (konečná hodnota je zahrnuta) |
array_length(arr) |
Počet prvků |
cardinality(arr) |
Počet prvků |
empty(arr) |
Pravda, pokud je prázdné |
array_ndims(arr) |
Počet dimenzí |
array_dims(arr) |
Informace o dimenzi |
array_has(arr, val) |
Kontrola obsažení |
array_has_all(arr, arr2) |
Kontrola obsažení všech hodnot |
array_has_any(arr, arr2) |
Kontrola obsažení libovolné hodnoty |
array_position(arr, val) |
První pozice hodnoty |
array_positions(arr, val) |
Všechny pozice hodnoty |
array_sort(arr) |
Řazení prvků |
array_reverse(arr) |
Obrácené pořadí |
array_distinct(arr) |
Odstranit duplicity |
flatten(arr) |
Zploštit o jednu úroveň |
array_slice(arr, start, end) |
Extrahovat dílčí pole |
array_append(arr, val) |
Připojit na konec |
array_prepend(val, arr) |
Vložení na začátek |
array_concat(arr1, arr2) |
Zřetězení polí |
array_remove(arr, val) |
Odstranit první výskyt |
array_remove_all(arr, val) |
Odstranit všechny výskyty |
array_remove_n(arr, val, n) |
Odstranit první n výskytů |
array_replace(arr, old, new) |
Nahradit první výskyt |
array_replace_n(arr, old, new, n) |
Nahradit první n výskytů |
array_replace_all(arr, old, new) |
Nahradit všechny výskyty |
array_pop_back(arr) |
Odstranit poslední prvek |
array_pop_front(arr) |
Odstranit první prvek |
array_repeat(val, n) |
Opakovat hodnotu n krát |
array_resize(arr, size, default) |
Změna velikosti s výchozí výplní |
array_intersect(arr1, arr2) |
Společné prvky |
array_union(arr1, arr2) |
Sjednocení prvků |
array_except(arr1, arr2) |
Rozdíl prvků |
array_max(arr) |
Maximální hodnota |
array_min(arr) |
Minimální hodnota |
array_any_value(arr) |
První hodnota, která není NULL |
array_to_string(arr, delim) |
Spojení prvků do řetězce |
array_element(arr, idx) |
Prvek na indexu |
Funkce pro mapy
| Funkce | Popis |
|---|---|
map(keys_arr, vals_arr) |
Vytvoření mapy z polí klíčů a hodnot |
map_keys(map) |
Všechny klíče jako pole |
map_values(map) |
Všechny hodnoty jako pole |
map_extract(map, key) |
Hodnota pro konkrétní klíč |