Freigeben über


INVALID_ARRAY_INDEX_IN_ELEMENT_AT-Fehlerklasse

SQLSTATE: 22003

Der Index <indexValue>liegt außerhalb der Begrenzung. Das Array enthält <arraySize> Elemente. Verwenden Sie try_element_at, 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

indexValue liegt außerhalb der Grenze der definierten Arrayelemente für den Ausdruck element_at(arrayExpr, indexValue) oder elt(arrayExpr, indexValue).

Der Wert muss zwischen -arraySize und arraySize liegen, ausgenommen 0.

Lösung

Die Entschärfung dieses Fehlers hängt von der Ursache ab:

  • Ist die Kardinalität des Arrays kleiner als erwartet?

    Korrigieren Sie das Eingabearray, und führen Sie die Abfrage erneut aus.

  • Wurde indexValue falsch berechnet?

    Passen Sie indexValue an, und führen Sie die Abfrage erneut aus.

  • 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), um Verweise außerhalb der Begrenzung zu tolerieren.

    Wenn Sie den Ausdruck nicht ändern können, setzen Sie ansiConfig als letzten Ausweg vorübergehend auf false fest, um Verweise außerhalb der Begrenzung zu tolerieren.

Beispiele

-- An INVALID_ARRAY_INDEX_IN_ELEMENT_AT error because of mismatched indexing
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
  [INVALID_ARRAY_INDEX_IN_ELEMENT_AT] The index 4 is out of bounds. The array has 3 elements. If necessary set "ANSI_MODE" to false to bypass this error.

-- Increase the aray size to cover the index
> SELECT element_at(array('a', 'b', 'c', 'd'), index) FROM VALUES(1), (4) AS T(index);
  a
  d

-- Adjusting the index to match the array
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (3) AS T(index);
  a
  c

-- Tolerating out of bound array index with adjustment to 1-based indexing
> SELECT try_element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
  a
  NULL

-- Tolerating out of bound by setting ansiConfig in Databricks SQL
> SET ANSI_MODE = false;
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
  a
  NULL
> SET ANSI_MODE = true;

-- Tolerating out of bound by setting ansiConfig in Databricks Runtime
> SET spark.sql.ansi.enabled = false;
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
  a
  NULL
> SET spark.sql.ansi.enabled = true;