INVALID_ARRAY_INDEX hibaosztály
Az index <indexValue>
kívül esik a korlátokon. A tömb elemeit tartalmazza <arraySize>
. Használja az SQL-függvényt get()
az érvénytelen indexhez való hozzáférés elviseléséhez, és adja vissza a NULL értéket. Ha szükséges, állítsa a "false" értéket <ansiConfig>
a hiba megkerüléséhez.
Paraméterek
- indexÉrték: A kért index a tömbbe.
- arraySize: A tömb számossága.
- ansiConfig: Az ANSI-mód módosítására vonatkozó konfigurációs beállítás.
Magyarázat
A element_at és az elt függvénytől eltérően a tömbbe a arrayExpr[indexValue] szintaxist használó hivatkozásnak indexValue
az első elem és arraySize - 1
az utolsó elem között 0
kell lennie.
A negatív indexValue
vagy az annál nagyobb vagy egyenlő arraySize
érték nem engedélyezett.
Kezelés
A hiba elhárítása a szándéktól függ:
A megadottak
indexValue
1-alapú indexelést feltételeznek?A megfelelő tömbelem megoldásához használja element_at(arrayExpr, indexValue), elt(arrayExpr, indexValue)' vagy arrayExpr[indexValue - 1] függvényt.
indexValue
A negatív arra számít, hogy a tömb végéhez képest kéri le az elemet?Használja element_at(arrayExpr, indexValue) vagy elt(arrayExpr, indexValue)" parancsot. Szükség esetén módosítsa az 1-alapú indexelést.
Elvárja, hogy az index számosságán kívül eső elemek esetében visszaadott értéket kapjon
NULL
?Ha módosíthatja a kifejezést, a try_element_at(tömbExpr, indexÉrték + 1) használatával tűrheti a kötött hivatkozások használatát. Jegyezze fel az 1-alapú indexelést a következőhöz:
try_element_at
.Ha nem tudja módosítani a kifejezést, végső megoldásként ideiglenesen állítsa be a értéket úgy, hogy
false
eltűrje aansiConfig
kötve lévő hivatkozásokat.
Példák
-- An INVALID_ARRAY_INDEX error because of mismatched indexing
> SELECT array('a', 'b', 'c')[index] FROM VALUES(1), (3) AS T(index);
[INVALID_ARRAY_INDEX] The index 3 is out of bounds. The array has 3 elements. If necessary set "ANSI_MODE" to false to bypass this error.
-- Using element_at instead for 1-based indexing
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (3) AS T(index);
a
c
-- Adjusting the index to be 0-based
> SELECT array('a', 'b', 'c')[index -1] FROM VALUES(1), (3) AS T(index);
-- Tolerating out of bound array index with adjustment to 1-based indexing
> SELECT try_element_at(array('a', 'b', 'c'), index + 1) FROM VALUES(1), (3) AS T(index);
b
NULL
-- An INVALID_ARRAY_INDEX error because of negative index
> SELECT array('a', 'b', 'c')[index] FROM VALUES(-1), (2) AS T(index);
[INVALID_ARRAY_INDEX] The index -1 is out of bounds. The array has 3 elements. If necessary set "ANSI_MODE" to "false" to bypass this error.
-- Using element_at to index relative to the end of the array
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(-1), (2) AS T(index);
c
b
-- Tolerating an out of bound index by setting ansiConfig in Databricks SQL
> SET ANSI_MODE = false;
> SELECT array('a', 'b', 'c')[index] FROM VALUES(1), (3) AS T(index);
b
NULL
> SET ANSI_MODE = true;
-- Tolerating an out of bound index by setting ansiConfig in Databricks Runtime
> SET spark.sql.ansi.enabled = false;
> SELECT array('a', 'b', 'c')[index] FROM VALUES(1), (3) AS T(index);
b
NULL
> SET spark.sql.ansi.enabled = true;