Freigeben über


Fehlerbedingung „INVALID_ARRAY_INDEX”

SQLSTATE: 22003

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 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.

  • Ist indexValue negativ 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 NULL Wert 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 ansiConfig auf false, 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;