INTEGRITY Dokumentace

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 5

funkce get_field

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

Pole struktury v WHERE

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

Pole 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 10

Pole 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 1

Pole

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 5

Vytváření polí

make_array

Vytvoří pole ze seznamu hodnot.

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

string_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 5

rozsah

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 1

generate_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 1

Prozkoumat pole

array_length

Vrací počet prvků v poli.

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

cardinality

Vrací celkový počet prvků v poli. Alias pro array_length.

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

empty

Vrací true, pokud pole neobsahuje žádné prvky.

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

array_ndims

Vrací počet rozměrů pole.

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

array_dims

Vrací rozměry pole.

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

Vyhledá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 5

array_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 1

array_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 1

array_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 1

array_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 1

Transformace polí

array_sort

Řadí prvky pole.

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

array_reverse

Obrátí pořadí prvků v poli.

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

array_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 1

flatten

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 1

array_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 1

array_prepend

Vloží hodnotu na začátek pole.

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

array_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 1

array_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 1

array_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 1

array_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 1

array_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 1

array_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 1

array_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 1

array_pop_back

Odstraní poslední prvek z pole.

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

array_pop_front

Odstraní první prvek z pole.

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

array_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 1

array_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 1

Množ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 1

array_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 1

array_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 1

Agregace hodnot pole

array_max

Vrací maximální hodnotu v poli.

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

array_min

Vrací minimální hodnotu v poli.

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

array_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 1

array_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 1

Př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 5

Mapy

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 5

map_values

Vrátí všechny hodnoty z mapy jako pole.

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

map_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 5

Vytvář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íč