فئة الخطأ INVALID_ARRAY_INDEX

SQLSTATE: 22003

الفهرس <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;