فئة الخطأ INVALID_ARRAY_INDEX
الفهرس <indexValue>
خارج الحدود. يحتوي الصفيف على <arraySize>
عناصر. استخدم الدالة get()
SQL لتحمل الوصول إلى العنصر في فهرس غير صالح وإرجاع NULL بدلا من ذلك. إذا لزم الأمر، فقم بتعيين <ansiConfig>
إلى "خطأ" لتجاوز هذا الخطأ.
معلمات
- indexValue: الفهرس المطلوب في الصفيف.
- arraySize: العلاقة الأساسية للصفيف.
- ansiConfig: إعداد التكوين لتغيير وضع ANSI.
تفسير
على عكس element_atوإيلت، يجب أن يكون المرجع indexValue
في صفيف باستخدام بناء الجملة arrayExpr[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) للتسامح مع المراجع خارج النطاق. لاحظ الفهرسة المستندة إلى 1 ل
try_element_at
.إذا لم تتمكن من تغيير التعبير، كحل أخير، فقم
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;