Funkcje tablicowe
| Nazwa | Opis |
ARRAY
|
Zwraca ARRAY zawierającą po jednym elemencie dla każdego argumentu wejściowego.
|
ARRAY_CONCAT
|
Łączy wiele tablic w jedną ARRAY.
|
ARRAY_CONTAINS
|
Zwraca TRUE, jeśli dany ARRAY zawiera określoną wartość.
|
ARRAY_CONTAINS_ALL
|
Zwraca TRUE, jeśli wszystkie wartości znajdują się w ARRAY.
|
ARRAY_CONTAINS_ANY
|
Zwraca wartość TRUE, jeśli którakolwiek z wartości występuje w ARRAY
|
ARRAY_FILTER
|
Odfiltrowuje elementy z ARRAY, które nie spełniają predykatu.
|
ARRAY_FIRST
|
Zwraca pierwszy element w ARRAY
|
ARRAY_FIRST_N
|
Zwraca pierwsze n elementów w ARRAY
|
ARRAY_GET
|
Zwraca element o podanym indeksie w ARRAY
|
ARRAY_INDEX_OF
|
Zwraca indeks pierwszego wystąpienia wartości w ARRAY
|
ARRAY_INDEX_OF_ALL
|
Zwraca wszystkie indeksy wartości w ARRAY
|
ARRAY_LENGTH
|
Zwraca liczbę elementów w ARRAY
|
ARRAY_LAST
|
Zwraca ostatni element w ARRAY
|
ARRAY_LAST_N
|
Zwraca ostatnie n elementów w ARRAY
|
ARRAY_REVERSE
|
Odwraca kolejność elementów w ARRAY.
|
ARRAY_SLICE
|
Zwraca wycinek ARRAY.
|
ARRAY_TRANSFORM
|
Przekształca elementy w ARRAY, stosując wyrażenie do każdego elementu.
|
MAXIMUM
|
Zwraca maksymalną wartość w kolumnie ARRAY
|
MAXIMUM_N
|
Zwraca n największych wartości w ARRAY
|
MINIMUM
|
Zwraca minimalną wartość w ARRAY
|
MINIMUM_N
|
Zwraca n najmniejszych wartości w ARRAY
|
SUM
|
Zwraca sumę wszystkich wartości NUMERIC w ARRAY.
|
JOIN
|
Tworzy połączenie elementów w ARRAY jako wartość STRING.
|
ARRAY
Składnia:
array(values: ANY...) -> ARRAY
Opis:
Tworzy tablicę z podanych elementów.
- Jeśli argument nie istnieje, w wynikowej tablicy jest zastępowany wartością
NULL.
Przykłady:
| wartości | array(values) |
|---|---|
| () | [] |
| (1, 2, 3) | [1, 2, 3] |
| ("a", 1, true) | ["a", 1, true] |
| (1, null) | [1, null] |
| (1, [2, 3]) | [1, [2, 3]] |
ARRAY_CONCAT
Składnia:
array_concat(arrays: ARRAY...) -> ARRAY
Opis:
Łączy co najmniej 2 tablice w jedną ARRAY.
Przykłady:
| tablice, | array_concat(arrays) |
|---|---|
| ([1, 2], [3, 4]) | [1, 2, 3, 4] |
| (["a", "b"], ["c"]) | ["a", "b", "c"] |
| ([1], [2], [3]) | [1, 2, 3] |
| ([], [1, 2]) | [1, 2] |
Node.js
const result = await db.pipeline() .collection("books") .select(field("genre").arrayConcat([field("subGenre")]).as("allGenres")) .execute();
Swift
let result = try await db.pipeline() .collection("books") .select([Field("genre").arrayConcat([Field("subGenre")]).as("allGenres")]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select(field("genre").arrayConcat(field("subGenre")).alias("allGenres")) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select(field("genre").arrayConcat(field("subGenre")).alias("allGenres")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select(Field.of("genre").array_concat(Field.of("subGenre")).as_("allGenres")) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select(arrayConcat(field("genre"), field("subGenre")).as("allGenres")) .execute() .get();
ARRAY_CONTAINS
Składnia:
array_contains(array: ARRAY, value: ANY) -> BOOLEAN
Opis:
Zwraca TRUE, jeśli w array znajdzie się value, a w przeciwnym razie zwraca FALSE.
Przykłady:
| tablica | wartość | array_contains(array, value) |
|---|---|---|
| [1, 2, 3] | 2 | prawda |
| [[1, 2], [3]] | [1, 2] | prawda |
| [1, null] | null | prawda |
| „abc” | DOWOLNA | błąd |
Node.js
const result = await db.pipeline() .collection("books") .select(field("genre").arrayContains(constant("mystery")).as("isMystery")) .execute();
Web
const result = await execute(db.pipeline() .collection("books") .select(field("genre").arrayContains(constant("mystery")).as("isMystery")) );
Swift
let result = try await db.pipeline() .collection("books") .select([Field("genre").arrayContains(Constant("mystery")).as("isMystery")]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select(field("genre").arrayContains("mystery").alias("isMystery")) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select(field("genre").arrayContains("mystery").alias("isMystery")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select(Field.of("genre").array_contains("mystery").as_("isMystery")) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select(arrayContains(field("genre"), "mystery").as("isMystery")) .execute() .get();
ARRAY_CONTAINS_ALL
Składnia:
array_contains_all(array: ARRAY, search_values: ARRAY) -> BOOLEAN
Opis:
Zwraca wartość TRUE, jeśli wszystkie elementy search_values znajdują się w elemencie array, a w przeciwnym razie zwraca wartość FALSE.
Przykłady:
| tablica | szukane_wartości | array_contains_all(array, search_values) |
|---|---|---|
| [1, 2, 3] | [1, 2] | prawda |
| [1, 2, 3] | [1, 4] | fałsz |
| [1, null] | [wartość nieokreślona] | prawda |
| [NaN] | [NaN] | prawda |
| [] | [] | prawda |
| [1, 2, 3] | [] | prawda |
Node.js
const result = await db.pipeline() .collection("books") .select( field("genre") .arrayContainsAll([constant("fantasy"), constant("adventure")]) .as("isFantasyAdventure") ) .execute();
Web
const result = await execute(db.pipeline() .collection("books") .select( field("genre") .arrayContainsAll([constant("fantasy"), constant("adventure")]) .as("isFantasyAdventure") ) );
Swift
let result = try await db.pipeline() .collection("books") .select([ Field("genre") .arrayContainsAll([Constant("fantasy"), Constant("adventure")]) .as("isFantasyAdventure") ]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select( field("genre") .arrayContainsAll(listOf("fantasy", "adventure")) .alias("isFantasyAdventure") ) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select( field("genre") .arrayContainsAll(Arrays.asList("fantasy", "adventure")) .alias("isFantasyAdventure") ) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select( Field.of("genre") .array_contains_all(["fantasy", "adventure"]) .as_("isFantasyAdventure") ) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select( arrayContainsAll(field("genre"), Arrays.asList("fantasy", "adventure")) .as("isFantasyAdventure")) .execute() .get();
ARRAY_CONTAINS_ANY
Składnia:
array_contains_any(array: ARRAY, search_values: ARRAY) -> BOOLEAN
Opis:
Zwraca wartość TRUE, jeśli w elemencie array znajdzie się którykolwiek z elementów search_values, a w przeciwnym razie zwraca wartość FALSE.
Przykłady:
| tablica | szukane_wartości | array_contains_any(array, search_values) |
|---|---|---|
| [1, 2, 3] | [4, 1] | prawda |
| [1, 2, 3] | [4, 5] | fałsz |
| [1, 2, null] | [wartość nieokreślona] | prawda |
Node.js
const result = await db.pipeline() .collection("books") .select( field("genre") .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) .as("isMysteryOrFantasy") ) .execute();
Web
const result = await execute(db.pipeline() .collection("books") .select( field("genre") .arrayContainsAny([constant("fantasy"), constant("nonfiction")]) .as("isMysteryOrFantasy") ) );
Swift
let result = try await db.pipeline() .collection("books") .select([ Field("genre") .arrayContainsAny([Constant("fantasy"), Constant("nonfiction")]) .as("isMysteryOrFantasy") ]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select( field("genre") .arrayContainsAny(listOf("fantasy", "nonfiction")) .alias("isMysteryOrFantasy") ) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select( field("genre") .arrayContainsAny(Arrays.asList("fantasy", "nonfiction")) .alias("isMysteryOrFantasy") ) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select( Field.of("genre") .array_contains_any(["fantasy", "nonfiction"]) .as_("isMysteryOrFantasy") ) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select( arrayContainsAny(field("genre"), Arrays.asList("fantasy", "nonfiction")) .as("isMysteryOrFantasy")) .execute() .get();
ARRAY_FILTER
Składnia:
array_filter(array: ARRAY, predicate: (ANY) -> BOOLEAN) -> ARRAY
Opis:
Filtruje array za pomocą wyrażenia predicate i zwraca nową tablicę zawierającą tylko elementy spełniające predykat.
- Dla każdego elementu w
arrayobliczana jest wartośćpredicate. Jeśli zwróci wartośćtrue, element zostanie uwzględniony w wyniku. W przeciwnym razie (jeśli zwróci wartośćfalselubnull) zostanie pominięty. - Jeśli
predicatezwraca wartość nieboolowską lub niepustą, funkcja zwraca błąd.
Przykłady:
| tablica | orzeczenie, | array_filter(array, predicate) |
|---|---|---|
| [1, 2, 3] | x -> x > 1 | [2, 3] |
| [1, null, 3] | x -> x > 1 | [3] |
| ["a", "b", "c"] | x -> x != "b" | ["a", "c"] |
| [] | x -> true | [] |
ARRAY_GET
Składnia:
array_get(array: ARRAY, index: INT64) -> ANY
Opis:
Zwraca element na pozycji index (liczonej od zera) w array.
- Jeśli
indexjest ujemne, elementy są dostępne od końca tablicy, gdzie-1jest ostatnim elementem. - Jeśli argument
arraynie jest typuARRAYani nie jest wartościąnull, zwraca błąd. - Jeśli
indexjest poza zakresem, funkcja zwraca wartość pustą. - Jeśli argument
indexnie jest typuINT64, funkcja zwraca błąd.
Przykłady:
| tablica | indeks | array_get(array, index) |
|---|---|---|
| [1, 2, 3] | 0 | 1 |
| [1, 2, 3] | -1 | 3 |
| [1, 2, 3] | 3 | nieobecny |
| [1, 2, 3] | -4 | nieobecny |
| „abc” | 0 | błąd |
| null | 0 | null |
Array |
„a” | błąd |
Array |
2,0 | błąd |
ARRAY_LENGTH
Składnia:
array_length(array: ARRAY) -> INT64
Opis:
Zwraca liczbę elementów w array.
Przykłady:
| tablica | array_length(array) |
|---|---|
| [1, 2, 3] | 3 |
| [] | 0 |
| [1, 1, 1] | 3 |
| [1, null] | 2 |
Node.js
const result = await db.pipeline() .collection("books") .select(field("genre").arrayLength().as("genreCount")) .execute();
Web
const result = await execute(db.pipeline() .collection("books") .select(field("genre").arrayLength().as("genreCount")) );
Swift
let result = try await db.pipeline() .collection("books") .select([Field("genre").arrayLength().as("genreCount")]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select(field("genre").arrayLength().alias("genreCount")) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select(field("genre").arrayLength().alias("genreCount")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select(Field.of("genre").array_length().as_("genreCount")) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select(arrayLength(field("genre")).as("genreCount")) .execute() .get();
ARRAY_REVERSE
Składnia:
array_reverse(array: ARRAY) -> ARRAY
Opis:
Odwraca podany array.
Przykłady:
| tablica | array_reverse(array) |
|---|---|
| [1, 2, 3] | [3, 2, 1] |
| ["a", "b"] | ["b", "a"] |
| [1, 2, 2, 3] | [3, 2, 2, 1] |
Node.js
const result = await db.pipeline() .collection("books") .select(arrayReverse(field("genre")).as("reversedGenres")) .execute();
Web
const result = await execute(db.pipeline() .collection("books") .select(field("genre").arrayReverse().as("reversedGenres")) );
Swift
let result = try await db.pipeline() .collection("books") .select([Field("genre").arrayReverse().as("reversedGenres")]) .execute()
Kotlin
val result = db.pipeline() .collection("books") .select(field("genre").arrayReverse().alias("reversedGenres")) .execute()
Java
Task<Pipeline.Snapshot> result = db.pipeline() .collection("books") .select(field("genre").arrayReverse().alias("reversedGenres")) .execute();
Python
from google.cloud.firestore_v1.pipeline_expressions import Field result = ( client.pipeline() .collection("books") .select(Field.of("genre").array_reverse().as_("reversedGenres")) .execute() )
Java
Pipeline.Snapshot result = firestore .pipeline() .collection("books") .select(arrayReverse(field("genre")).as("reversedGenres")) .execute() .get();
ARRAY_FIRST
Składnia:
array_first(array: ARRAY) -> ANY
Opis:
Zwraca pierwszy element w array. Jest to odpowiednik array_get(array, 0).
- Jeśli argument
arrayjest pusty, zwraca wartość nieobecną.
Przykłady:
| tablica | array_first(array) |
|---|---|
| [1, 2, 3] | 1 |
| [] | nieobecny |
ARRAY_FIRST_N
Składnia:
array_first_n(array: ARRAY, n: INT64) -> ARRAY
Opis:
Zwraca pierwsze n elementów z array. Jest to odpowiednik array_slice(array, 0, n).
- Jeśli argument
nma wartość ujemną, funkcja zwraca błąd.
Przykłady:
| tablica | n | array_first_n(array, n) |
|---|---|---|
| [1, 2, 3, 4, 5] | 3 | [1, 2, 3] |
| [1, 2] | 3 | [1, 2] |
| [1, 2, 3] | 0 | [] |
ARRAY_INDEX_OF
Składnia:
array_index_of(array: ARRAY, value: ANY) -> INT64
Opis:
Zwraca indeks (liczony od zera) pierwszego wystąpienia znaku value w ciągu array. Zwraca wartość -1, jeśli nie znaleziono wartości value.
Przykłady:
| tablica | wartość | array_index_of(array, value) |
|---|---|---|
| [1, 2, 3, 2] | 2 | 1 |
| [1, 2, 3] | 4 | -1 |
| [1, null, 3] | null | 1 |
ARRAY_INDEX_OF_ALL
Składnia:
array_index_of_all(array: ARRAY, value: ANY) -> ARRAY<INT64>
Opis:
Zwraca tablicę zawierającą indeksy wszystkich wystąpień value w ciągu array (indeksowanie od zera). Zwraca wartość [], jeśli nie znaleziono wartości value.
Przykłady:
| tablica | wartość | array_index_of_all(array, value) |
|---|---|---|
| [1, 2, 3, 2] | 2 | [1, 3] |
| [1, 2, 3] | 4 | [] |
| [1, null, 3, null] | null | [1, 3] |
ARRAY_LAST
Składnia:
array_last(array: ARRAY) -> ANY
Opis:
Zwraca ostatni element w array. Jest to odpowiednik array_get(array, -1).
- Jeśli argument
arrayjest pusty, zwraca wartość nieobecną.
Przykłady:
| tablica | array_last(array) |
|---|---|
| [1, 2, 3] | 3 |
| [] | nieobecny |
ARRAY_LAST_N
Składnia:
array_last_n(array: ARRAY, n: INT64) -> ARRAY
Opis:
Zwraca ostatnie n elementów z array.
- Jeśli argument
nma wartość ujemną, funkcja zwraca błąd.
Przykłady:
| tablica | n | array_last_n(array, n) |
|---|---|---|
| [1, 2, 3, 4, 5] | 3 | [3, 4, 5] |
| [1, 2] | 3 | [1, 2] |
| [1, 2, 3] | 0 | [] |
ARRAY_SLICE
Składnia:
array_slice(array: ARRAY, offset: INT64, length: INT64) -> ARRAY
Opis:
Zwraca podzbiór array zaczynający się od indeksu offset (liczonego od zera) i zawierający length elementów.
- Jeśli wartość
offsetjest ujemna, oznacza to pozycję początkową od końca tablicy, przy czym-1jest ostatnim elementem. - Jeśli
lengthjest większa niż liczba elementów pozostałych w tablicy pooffset, wynik rozciąga się do końca tablicy. lengthmusi być nieujemna, w przeciwnym razie funkcja zwraca błąd.
Przykłady:
| tablica | odliczyć | długość | array_slice(array, offset, length) |
|---|---|---|---|
| [1, 2, 3, 4, 5] | 1 | 3 | [2, 3, 4] |
| [1, 2, 3, 4, 5] | -2 | 2 | [4, 5] |
| [1, 2, 3] | 1 | 5 | [2, 3] |
| [1, 2, 3] | 3 | 2 | [] |
ARRAY_TRANSFORM
Składnia:
array_transform(array: ARRAY, expression: (ANY) -> ANY) -> ARRAY
array_transform(array: ARRAY, expression: (ANY, INT64) -> ANY) -> ARRAY
Opis:
Przekształca array, stosując expression do każdego elementu, i zwraca nową tablicę z przekształconymi elementami. Tablica wyjściowa zawsze będzie miała taki sam rozmiar jak tablica wejściowa.
expressionmoże być funkcją jednoargumentowąelement -> resultlub funkcją dwuargumentową(element, index) -> result.- Jeśli funkcja
expressionjest jednoargumentowa, jest wywoływana z każdym elementem funkcjiarray. - Jeśli
expressionjest funkcją binarną, jest wywoływana z każdym elementemarrayi odpowiadającym mu indeksem liczonym od zera.
Przykłady:
| tablica | wyrażenie | array_transform(array, expression) |
|---|---|---|
| [1, 2, 3] | x -> x * 2 | [2, 4, 6] |
| [1, 2, 3] | x -> x + 1 | [2, 3, 4] |
| [10, 20] | (x, i) -> x + i | [10, 21] |
| [] | x -> 1 | [] |
MAKSYMALNA
Składnia:
maximum(array: ARRAY) -> ANY
Opis:
Zwraca maksymalną wartość w array.
- Wartości
NULLsą ignorowane podczas porównywania. - Jeśli
arrayjest pusta lub zawiera tylko wartościNULL, zwracaNULL.
Przykłady:
| tablica | maximum(array) |
|---|---|
| [1, 5, 2] | 5 |
| [1, null, 5] | 5 |
| ["a", "c", "b"] | „c” |
| [null, null] | null |
| [] | null |
MAXIMUM_N
Składnia:
maximum_n(array: ARRAY, n: INT64) -> ARRAY
Opis:
Zwraca tablicę n największych wartości w array w kolejności malejącej.
- Wartości
NULLsą ignorowane. - Jeśli argument
nma wartość ujemną, funkcja zwraca błąd.
Przykłady:
| tablica | n | maximum_n(array, n) |
|---|---|---|
| [1, 5, 2, 4, 3] | 3 | [5, 4, 3] |
| [1, null, 5] | 3 | [5, 1] |
MINIMUM
Składnia:
minimum(array: ARRAY) -> ANY
Opis:
Zwraca minimalną wartość w kolumnie array.
- Wartości
NULLsą ignorowane podczas porównywania. - Jeśli
arrayjest pusta lub zawiera tylko wartościNULL, zwracaNULL.
Przykłady:
| tablica | minimum(array) |
|---|---|
| [1, 5, 2] | 1 |
| [5, null, 1] | 1 |
| ["a", "c", "b"] | „a” |
| [null, null] | null |
| [] | null |
MINIMUM_N
Składnia:
minimum_n(array: ARRAY, n: INT64) -> ARRAY
Opis:
Zwraca tablicę n najmniejszych wartości w zakresie array w kolejności rosnącej.
- Wartości
NULLsą ignorowane. - Jeśli argument
nma wartość ujemną, funkcja zwraca błąd.
Przykłady:
| tablica | n | minimum_n(array, n) |
|---|---|---|
| [1, 5, 2, 4, 3] | 3 | [1, 2, 3] |
| [5, null, 1] | 3 | [1, 5] |
SUMA
Składnia:
sum(array: ARRAY) -> INT64 | FLOAT64
Opis:
Zwraca sumę wszystkich wartości NUMERIC w ARRAY.
- Wartości nienumeryczne w tablicy są ignorowane.
- Jeśli jakakolwiek wartość liczbowa w tablicy to
NaN, funkcja zwracaNaN. - Typ zwracany jest określany przez najszerszy typ liczbowy w tablicy:
INT64<FLOAT64. - Jeśli przed zsumowaniem jakiejkolwiek wartości zmiennoprzecinkowej wystąpi przepełnienie 64-bitowej liczby całkowitej, zwracany jest błąd. Jeśli zsumowane zostaną wartości zmiennoprzecinkowe, przepełnienie spowoduje uzyskanie wartości +/- nieskończoność.
- Jeśli tablica nie zawiera żadnych wartości liczbowych, funkcja zwraca
NULL.
Przykłady:
| tablica | sum(array) |
|---|---|
| [1, 2, 3] | 6L |
| [1L, 2L, 3L] | 6L |
| [2000000000, 2000000000] | 4000000000L |
| [10, 20.5] | 30,5 |
| [1, "a", 2] | 3L |
| [INT64.MAX_VALUE, 1] | błąd |
| [INT64.MAX_VALUE, 1, -1.0] | błąd |
| [INT64.MAX_VALUE, 1.0] | 9,223372036854776e+18 |
Join
Składnia:
join[T <: STRING | BYTES](array: ARRAY<T>, delimiter: T) -> STRING
join[T <: STRING | BYTES](array: ARRAY<T>, delimiter: T, null_text: T) -> STRING
Opis:
Zwraca połączenie elementów w array jako STRING. Wartość array może być typu STRING lub BYTES.
- Wszystkie elementy w
array,delimiterinull_textmuszą być tego samego typu. Muszą to być elementySTRINGlubBYTES. - Jeśli podano parametr
null_text, wszystkie wartościNULLw parametrzearrayzostaną zastąpione wartościąnull_text. - Jeśli nie podano właściwości
null_text, wartościNULLwarraysą pomijane w wyniku.
Przykłady:
Gdy nie podano wartości null_text:
| tablica | separator | join(array, delimiter) |
|---|---|---|
| ["a", "b", "c"] | „,” | "a,b,c" |
| ["a", null, "c"] | „,” | "a,c" |
| [b'a', b'b', b'c'] | b',' | b'a,b,c' |
| ["a", b'c'] | „,” | błąd |
| ["a", "c"] | b',' | błąd |
| [b'a', b'c'] | „,” | błąd |
Gdy podano wartość null_text:
| tablica | separator | null_text | join(array, delimiter, null_text) |
|---|---|---|---|
| ["a", null, "c"] | „,” | „MISSING” | „a,MISSING,c” |
| [b'a', null, b'c'] | b',' | b'NULL' | b'a,NULL,c' |
| [null, "b", null] | „,” | „MISSING” | „MISSING,b,MISSING” |
| [b'a', null, null] | b',' | b'NULL' | b'a,NULL,NULL' |
| ["a", null] | „,” | b'N' | błąd |
| [b'a', null] | b',' | „N” | błąd |