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;