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;