foutklasse INVALID_ARRAY_INDEX
De index <indexValue>
is buiten de grenzen. De matrix bevat <arraySize>
elementen. Gebruik de SQL-functie get()
om toegang tot element bij een ongeldige index te tolereren en in plaats daarvan NULL te retourneren. Stel indien nodig in <ansiConfig>
op 'false' om deze fout te omzeilen.
Parameters
- indexValue: de aangevraagde index in de matrix.
- arraySize: de kardinaliteit van de matrix.
- ansiConfig: de configuratie-instelling voor het wijzigen van de ANSI-modus.
Uitleg
In tegenstelling tot element_at en elt, moet een verwijzing naar indexValue
een matrix met behulp van de syntaxis arrayExpr[indexValue] tussen 0
voor het eerste element en arraySize - 1
voor het laatste element zijn.
Een negatieve indexValue
waarde of een waarde groter of gelijk aan arraySize
is niet toegestaan.
Mitigatie
De beperking voor deze fout is afhankelijk van de intentie:
Gaat de opgegeven
indexValue
uit van 1-gebaseerde indexering?Gebruik element_at(arrayExpr, indexValue), elt(arrayExpr, indexValue)' of arrayExpr[indexValue - 1] om het juiste matrixelement op te lossen.
Is de
indexValue
negatieve verwachting om het element op te halen ten opzichte van het einde van de matrix?Gebruik element_at(arrayExpr, indexValue) of elt(arrayExpr, indexValue)'. Pas indien nodig aan voor indexering op basis van 1.
Verwacht u dat er een
NULL
waarde wordt geretourneerd voor elementen buiten de kardinaliteit van de index?Als u de expressie kunt wijzigen, gebruikt u try_element_at(arrayExpr, indexValue + 1) om verwijzingen buiten de afhankelijkheid te tolereren. Let op de 1-gebaseerde indexering voor
try_element_at
.Als u de expressie niet kunt wijzigen, stelt u als laatste redmiddel tijdelijk in
ansiConfig
op omfalse
verwijzingen buiten de afhankelijkheid te tolereren.
Voorbeelden
-- 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;