foutklasse INVALID_ARRAY_INDEX
De index <indexValue>
valt buiten de grenzen. De matrix bevat <arraySize>
elementen. Gebruik de SQL-functie get()
om het toegangselement op een ongeldige index te tolereren en in plaats daarvan NULL te retourneren. Stel indien nodig <ansiConfig>
in 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 eltmoet een verwijzing indexValue
in een array met behulp van de arrayExpr[indexValue] syntaxis tussen 0
voor het eerste element en arraySize - 1
voor het laatste element.
Een negatieve indexValue
of een waarde groter dan of gelijk aan arraySize
is niet toegestaan.
Verzachting
De oplossing voor deze fout is afhankelijk van de intentie:
Gaat de opgegeven
indexValue
uit van indexering op basis van één?Gebruik element_at(arrayExpr, indexValue), elt(arrayExpr, indexValue)' of arrayExpr[indexValue - 1] om het juiste matrixelement op te lossen.
Verwacht het
indexValue
negatieve element ten opzichte van het einde van de matrix op te halen?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 grenzen te tolereren. Let op de indexering op basis van 1 voor
try_element_at
.Als u de expressie als laatste redmiddel niet kunt wijzigen, stelt u de
ansiConfig
tijdelijk in opfalse
om verwijzingen buiten de grenzen 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;