Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse 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;