خطأ:وظيفة أونست (عدد صحيح []) غير موجود في كيو
-
27-10-2019 - |
سؤال
SELECT UNNEST(ARRAY[1,2,3,4])
أثناء تنفيذ الاستعلام أعلاه حصلت على الخطأ مثل هذا:
ERROR: function unnest(integer[]) does not exist in postgresql.
أنا باستخدام كيو 8.3 ولقد قمت بتثبيت _int.sql
حزمة في بلدي ديسيبل لعملية صفيف صحيح.
كيفية حل هذا الخطأ?
المحلول
unnest()
ليس جزءا من الوحدة intarray
, ، ولكن من كيو القياسية.ومع ذلك ، أنت تحتاج نسخة 8.4 أو في وقت لاحق لذلك.
حتى تتمكن من حل هذا عن طريق الترقية إلى إصدار أحدث ، ويفضل أن يكون الإصدار الحالي 9.1.انظر ال سياسة إصدار مشروع كيو.
إذا كان يجب عليك استخدام قاعدة بيانات هيروكو المشتركة ، والتي تستخدم حاليا الإصدار 8.3 ، فإنها تبحث في الترقية ، أيضا. هيروكو مختبرات تقدم بالفعل 9.1.
كما علق @ عبد ، يمكنك تنفيذ رجل فقير unnest()
في الإصدارات قبل كيو 8.4 نفسك:
CREATE OR REPLACE FUNCTION unnest(anyarray)
RETURNS SETOF anyelement AS
$BODY$
SELECT $1[i] FROM generate_series(array_lower($1,1), array_upper($1,1)) i;
$BODY$ LANGUAGE sql IMMUTABLE;
ومع ذلك ، كن على علم بأن هذا يعمل فقط من أجل صفائف أحادية البعد.(على عكس كيو unnest()
الذي يأخذ صفائف ذات أبعاد متعددة):
SELECT unnest('{1,2,3,4}'::int[]) -- works
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs)
أنت يمكن تنفيذ المزيد من الوظائف للمصفوفات ن الأبعاد:
CREATE OR REPLACE FUNCTION unnest2(anyarray) -- for 2-dimensional arrays
RETURNS SETOF anyelement AS
$BODY$
SELECT $1[i][j]
FROM (
SELECT i, generate_series(array_lower($1,2), array_upper($1,2)) j
FROM (
SELECT generate_series(array_lower($1,1), array_upper($1,1)) i
) x
) y;
$BODY$ LANGUAGE sql IMMUTABLE;
اتصل:
SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works!
يمكنك أيضا كتابة وظيفة بل / بسكل التي تتعامل مع أبعاد متعددة ...