INVALID_ARRAY_INDEX エラークラス
インデックス <indexValue>
が範囲外です。 配列には <arraySize>
つの要素があります。 SQL 関数 get()
を使用して、無効なインデックスの要素へのアクセスを許容し、代わりに NULL を返します。 必要に応じて、 <ansiConfig>
を "false" に設定して、このエラーを回避します。
パラメーター
- indexValue : 配列に要求されたインデックス。
- arraySize : 配列のカーディナリティ。
- ansiConfig : ANSI モードを変更するための構成設定。
説明
element_at や elt とは異なり、arrayExpr[indexValue] 構文を使用して配列にindexValue
参照は、最初の要素の 0
と最後の要素の arraySize - 1
の間にある必要があります。
負の indexValue
や arraySize
以上の値は許可されません。
緩和
このエラーの軽減策は、意図によって異なります。
-
提供されている
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
に設定して、範囲外の参照を許容します。
例
-- 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;