INVALID_ARRAY_INDEX錯誤類別
索引 <indexValue>
超出界限。 陣列具有 <arraySize>
個元素。 使用 SQL 函式 get()
來容許存取無效索引的專案,並改為傳回 NULL。 如有必要,請將 <ansiConfig>
設為 「false」 以略過此錯誤。
參數
- indexValue:陣列中要求的索引。
- arraySize:陣列的基數。
- ansiConfig:要改變 ANSI 模式的組態設定。
解釋
與 element_at 和 elt不同,使用 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;