foutklasse INVALID_ARRAY_INDEX_IN_ELEMENT_AT
De index <indexValue>
valt buiten bereik. De matrix bevat <arraySize>
elementen. Gebruik try_element_at
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
indexValue
valt buiten de grenzen van gedefinieerde matrixelementen voor een element_at(arrayExpr, indexValue)of elt(arrayExpr, indexValue) expressie.
De waarde moet tussen -arraySize
en arraySize
zijn, met uitzondering van 0
.
Mitigatie
De oplossing voor deze fout is afhankelijk van de oorzaak:
Is de kardinaliteit van de matrix kleiner dan verwacht?
Corrigeer de invoermatrix en voer de query opnieuw uit.
Is
indexValue
onjuist berekend?Pas
indexValue
aan en voer de query opnieuw uit.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) om verwijzingen buiten de grenzen te tolereren.
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_IN_ELEMENT_AT error because of mismatched indexing
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
[INVALID_ARRAY_INDEX_IN_ELEMENT_AT] The index 4 is out of bounds. The array has 3 elements. If necessary set "ANSI_MODE" to false to bypass this error.
-- Increase the aray size to cover the index
> SELECT element_at(array('a', 'b', 'c', 'd'), index) FROM VALUES(1), (4) AS T(index);
a
d
-- Adjusting the index to match the array
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (3) AS T(index);
a
c
-- Tolerating out of bound array index with adjustment to 1-based indexing
> SELECT try_element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
a
NULL
-- Tolerating out of bound by setting ansiConfig in Databricks SQL
> SET ANSI_MODE = false;
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
a
NULL
> SET ANSI_MODE = true;
-- Tolerating out of bound by setting ansiConfig in Databricks Runtime
> SET spark.sql.ansi.enabled = false;
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
a
NULL
> SET spark.sql.ansi.enabled = true;