سؤال

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!

يمكنك أيضا كتابة وظيفة بل / بسكل التي تتعامل مع أبعاد متعددة ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top