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 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.
- indexValue: Der angeforderte Index im Array.
- arraySize: Die Kardinalität des Arrays.
- ansiConfig: Die Konfigurationseinstellung zur Änderung des ANSI-Modus.
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.
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.
-- 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;