foutklasse INVALID_ARRAY_INDEX

SQLSTATE: 22003

De index <indexValue> is buiten de grenzen. De matrix bevat <arraySize> elementen. Gebruik de SQL-functie get() om toegang tot element bij een ongeldige index te tolereren en in plaats daarvan NULL te retourneren. Stel indien nodig in <ansiConfig> op 'false' om deze fout te omzeilen.

Parameters

  • indexValue: de aangevraagde index in de matrix.
  • arraySize: de kardinaliteit van de matrix.
  • ansiConfig: de configuratie-instelling voor het wijzigen van de ANSI-modus.

Uitleg

In tegenstelling tot element_at en elt, moet een verwijzing naar indexValue een matrix met behulp van de syntaxis arrayExpr[indexValue] tussen 0 voor het eerste element en arraySize - 1 voor het laatste element zijn.

Een negatieve indexValue waarde of een waarde groter of gelijk aan arraySize is niet toegestaan.

Mitigatie

De beperking voor deze fout is afhankelijk van de intentie:

Voorbeelden

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