INVALID_ARRAY_INDEX-Fehlerklasse
Der Index <indexValue>
liegt außerhalb der Begrenzung. Das Array enthält <arraySize>
Elemente. Verwenden Sie die SQL-Funktion get()
, um den Zugriff auf ein Element mit ungültigem Index zu tolerieren und stattdessen NULL zurückzugeben. Legen Sie <ansiConfig>
bei Bedarf auf „false“ fest, um diesen Fehler zu umgehen.
Parameter
- indexValue: Der angeforderte Index im Array.
- arraySize: Die Kardinalität des Arrays.
- ansiConfig: Die Konfigurationseinstellung zur Änderung des ANSI-Modus.
Erklärung
Anders als bei element_at und elt muss ein Verweis-indexValue
auf ein Array mit der Syntax arrayExpr[indexValue] zwischen 0
für das erste und arraySize - 1
für das letzte Element liegen.
Ein negativer indexValue
oder ein Wert, der größer oder gleich arraySize
ist, ist nicht zulässig.
Lösung
Die Entschärfung dieses Fehlers hängt von der Absicht ab:
Geht das bereitgestellte
indexValue
von einer 1-basierten Indizierung aus?Verwenden Sie element_at(arrayExpr, indexValue), elt(arrayExpr, indexValue) oder arrayExpr[indexValue - 1], um das richtige Arrayelement aufzulösen.
Erwartet der negative
indexValue
, der das Abrufen des Element relativ zum Ende des Arrays erwartet?Verwenden Sie element_at(arrayExpr, indexValue) oder elt(arrayExpr, indexValue)`. Passen Sie die 1-basierte Indizierung an, falls erforderlich.
Erwarten Sie, dass Sie für Elemente außerhalb der Kardinalität des Index einen
NULL
-Wert zurückbekommen?Wenn Sie den Ausdruck ändern können, verwenden Sie try_element_at(arrayExpr, indexValue + 1), um Verweise außerhalb der Begrenzung zu tolerieren. Beachten Sie die 1-basierte Indizierung für
try_element_at
.Wenn Sie den Ausdruck nicht ändern können, setzen Sie
ansiConfig
als letzten Ausweg vorübergehend auffalse
fest, um Verweise außerhalb der Begrenzung zu tolerieren.
Beispiele
-- 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;