メインコンテンツまでスキップ

INVALID_ARRAY_INDEX エラークラス

SQLSTATE: 22003

インデックス <indexValue> が範囲外です。 配列には <arraySize> つの要素があります。 SQL 関数 get() を使用して、無効なインデックスの要素へのアクセスを許容し、代わりに NULL を返します。 必要に応じて、 <ansiConfig> を "false" に設定して、このエラーを回避します。

パラメーター

  • indexValue : 配列に要求されたインデックス。
  • arraySize : 配列のカーディナリティ。
  • ansiConfig : ANSI モードを変更するための構成設定。

説明

element_atelt とは異なり、arrayExpr[indexValue] 構文を使用して配列にindexValue参照は、最初の要素の 0 と最後の要素の arraySize - 1 の間にある必要があります。

負の indexValuearraySize 以上の値は許可されません。

緩和

このエラーの軽減策は、意図によって異なります。

  • 提供されている indexValue は 1 から始まるインデックス作成を想定していますか?

    正しい配列要素を解決するには、 element_at(arrayExpr, indexValue)elt(arrayExpr, indexValue)'、または arrayExpr[indexValue - 1] を使用してください。

  • indexValue負は、配列の末尾に対して要素を取得することを期待していますか?

    element_at(arrayExpr, indexValue) または elt(arrayExpr, indexValue)' を使用します。必要に応じて、1 から始まるインデックス作成に調整します。

  • インデックスのカーディナリティ以外の要素に対して NULL 値が返されることを期待していますか?

    式を変更できる場合は、 try_element_at(arrayExpr, indexValue + 1) を使用して、範囲外の参照を許容します。try_element_atの 1 から始まるインデックスに注意してください。

    式を変更できない場合は、最後の手段として、 ansiConfig を一時的に false に設定して、範囲外の参照を許容します。

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

関連