Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Index <indexValue>liegt außerhalb der Begrenzung. Das Array verfügt über <arraySize> Elemente. Verwenden Sie die SQL-Funktion get(), um den Zugriff auf das Element bei einem ungültigen Index zu tolerieren und stattdessen NULL zurückzugeben. Legen Sie <ansiConfig> bei Bedarf auf "false" fest, um diesen Fehler zu umgehen.
Die Parameter
- indexValue: Der angeforderte Index im Array.
- arraySize: Die Kardinalität des Arrays.
- ansiConfig: Die Konfigurationseinstellung zum Ändern des ANSI-Modus.
Explanation
Im Gegensatz zu element_at und elt muss ein Verweis indexValue auf ein Array mit der ArrayExpr[indexValue] -Syntax zwischen 0 dem ersten Element und arraySize - 1 dem letzten Element sein.
Ein negativer indexValue oder ein Wert, der größer oder gleich arraySize ist, ist nicht zulässig.
Abschwächung
Die Entschärfung für diesen Fehler hängt von der Absicht ab:
Geht die bereitgestellte
indexValuevon einer 1-basierten Indizierung aus?Verwenden Sie element_at(arrayExpr, indexValue), elt(arrayExpr, indexValue)' oder arrayExpr[indexValue - 1] , um das richtige Arrayelement aufzulösen.
Ist
indexValuenegativ gemeint, um ein Element relativ zum Ende des Arrays abzurufen?Verwenden Sie element_at(arrayExpr, indexValue) oder elt(arrayExpr, indexValue)'. Passen Sie bei Bedarf die 1-basierte Indizierung an.
Erwarten Sie, dass ein
NULLWert für Elemente außerhalb der Kardinalität des Indexes zurückgegeben wird?Wenn Sie den Ausdruck ändern können, verwenden Sie try_element_at(arrayExpr, indexValue + 1), um Verweise außerhalb der Grenzen zu tolerieren. Beachten Sie die 1-basierte Indizierung für
try_element_at.Wenn Sie den Ausdruck nicht ändern können, setzen Sie als letzten Ausweg vorübergehend
ansiConfigauffalse, um Verweise außerhalb der Grenzen zu tolerieren.
Examples
-- 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;