INVALID_ARRAY_INDEX felklass
Indexet <indexValue>
ligger utanför gränserna. Matrisen har <arraySize>
element. Använd SQL-funktionen get()
för att tolerera åtkomst till element vid ogiltigt index och returnera NULL i stället. Om det behövs anger du <ansiConfig>
"false" för att kringgå det här felet.
Parametrar
- indexValue: Det begärda indexet i matrisen.
- arraySize: Matrisens kardinalitet.
- ansiConfig: Konfigurationsinställningen för att ändra ANSI-läge.
Förklaring
Till skillnad från element_at och elt måste en referens indexValue
till en matris som använder syntaxen arrayExpr[indexValue] vara mellan 0
för det första elementet och arraySize - 1
för det sista elementet.
Ett negativt indexValue
värde eller ett värde som är större eller lika med arraySize
tillåts inte.
Lindring
Lösningen för det här felet beror på avsikten:
Förutsätter den angivna
indexValue
1-baserade indexeringen?Använd element_at(arrayExpr, indexValue), elt(arrayExpr, indexValue)' eller arrayExpr[indexValue - 1] för att matcha rätt matriselement.
Förväntas det
indexValue
negativa hämta elementet i förhållande till slutet av matrisen?Använd element_at(arrayExpr, indexValue) eller elt(arrayExpr, indexValue)'. Justera för 1-baserad indexering om det behövs.
Förväntar du dig att ett
NULL
värde returneras för element utanför indexets kardinalitet?Om du kan ändra uttrycket använder du try_element_at(arrayExpr, indexValue + 1) för att tolerera referenser utanför gränsen. Observera den 1-baserade indexeringen för
try_element_at
.Om du inte kan ändra uttrycket, som en sista utväg, ställer du tillfälligt in
ansiConfig
till förfalse
att tolerera referenser utanför gränsen.
Exempel
-- 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;