次の方法で共有


INVALID_ARRAY_INDEX エラー クラス

SQLSTATE: 22003

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

パラメーター

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

説明

element_atelt とは異なり、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;