Partager via


classe d’erreur INVALID_ARRAY_INDEX_IN_ELEMENT_AT

SQLSTATE : 22003

L'index <indexValue> est hors limites. Le tableau comporte des éléments <arraySize>. Utilisez try_element_at pour tolérer l’accès à l’élément à un index non valide et retourner la valeur NULL à la place. Si nécessaire, définissez <ansiConfig> sur « false » pour contourner cette erreur.

Paramètres

  • indexValue: index demandé dans le tableau.
  • arraySize : cardinalité du tableau.
  • ansiConfig : paramètre de configuration pour modifier le mode ANSI.

Explication

indexValueest au-delà de la limite des éléments de tableau définis pour une expression element_at(arrayExpr, indexValue)ou elt(arrayExpr, indexValue).

La valeur doit être comprise entre -arraySize et arraySize, à l’exception de 0.

Limitation des risques

La manière d’atténuer l’erreur dépendra de sa cause :

  • La cardinalité du tableau est-elle plus petite que prévu ?

    Corrigez le tableau d’entrée et réexécutez la requête.

  • A-t-il indexValue été calculé incorrectement ?

    Ajustez indexValue et réexécutez la requête.

  • Prévoyez-vous de retourner une NULL valeur pour les éléments en dehors de la cardinalité de l’index ?

    Si vous pouvez modifier l’expression, utilisez try_element_at(arrayExpr, indexValue) pour tolérer les références hors de limite.

    Si vous ne pouvez pas modifier l’expression, en dernier recours, définissez temporairement la valeur ansiConfig sur false pour tolérer les références hors limites.

Exemples

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