9.4 বা তার পরে পোস্টগ্রেস করে
WITH ORDINALITY
সেট-রিটার্নিং ফাংশনগুলির জন্য ব্যবহার করুন :
FROM
ধারাটিতে কোনও ফাংশন যখন প্রত্যয়িত হয় WITH ORDINALITY
, তখন একটি
bigint
কলাম আউটপুটে যুক্ত হয় যা 1 থেকে শুরু হয় এবং ফাংশনের আউটপুটটির প্রতিটি সারিটির জন্য 1 দ্বারা বৃদ্ধি হয়। সেট রিটার্নিং ফাংশনগুলির ক্ষেত্রে এটি সবচেয়ে কার্যকর unnest()
।
LATERAL
পৃষ্ঠা 9.3+-এ বৈশিষ্ট্যটির সাথে এবং পিএএসএসকিএল-হ্যাকারগুলির এই থ্রেড অনুসারে , উপরের প্রশ্নটি এখন এইভাবে লেখা যেতে পারে:
SELECT t.id, a.elem, a.nr
FROM tbl AS t
LEFT JOIN LATERAL unnest(string_to_array(t.elements, ','))
WITH ORDINALITY AS a(elem, nr) ON TRUE;
LEFT JOIN ... ON TRUE
বাম টেবিলের সমস্ত সারি সংরক্ষণ করে, ডানদিকে টেবিলের অভিব্যক্তিটি যদি কোনও সারি দেয় না। যদি এটি উদ্বেগের বিষয় না হয় তবে আপনি এটি অন্যথায় সমতুল্য ব্যবহার করতে পারেন, কম ভার্বোস ফর্মটি অন্তর্ভুক্ত সহCROSS JOIN LATERAL
:
SELECT t.id, a.elem, a.nr
FROM tbl t, unnest(string_to_array(t.elements, ',')) WITH ORDINALITY a(elem, nr);
অথবা সরল যদি ভিত্তি করে থাকে একটি সত্যিকারের অ্যারের সরানো হয় ( arr
অ্যারে কলাম হচ্ছে):
SELECT t.id, a.elem, a.nr
FROM tbl t, unnest(t.arr) WITH ORDINALITY a(elem, nr);
বা এমনকি, ন্যূনতম সিনট্যাক্স সহ:
SELECT id, a, ordinality
FROM tbl, unnest(arr) WITH ORDINALITY a;
a
স্বয়ংক্রিয়ভাবে টেবিল হয় এবং কলামের নাম। যুক্ত অরডিনালিটি কলামের ডিফল্ট নাম ordinality
। তবে সুস্পষ্ট কলামের নাম এবং টেবিল-যোগ্য কোলাম যুক্ত করা ভাল (নিরাপদ, ক্লিনার)।
পোস্টগ্রিজ 8.4 - 9.3
সঙ্গে row_number() OVER (PARTITION BY id ORDER BY elem)
আপনি সাজানোর ক্রম অনুসারে সংখ্যাগুলি পাওয়ার স্ট্রিংয়ের মূল অর্ডিনাল অবস্থানের অর্ডিনাল সংখ্যাটি নয় ।
আপনি কেবল বাদ দিতে পারেন ORDER BY
:
SELECT *, row_number() OVER (PARTITION by id) AS nr
FROM (SELECT id, regexp_split_to_table(elements, ',') AS elem FROM tbl) t;
যদিও এটি সাধারণত কার্যকর হয় এবং আমি কখনও কখনও এটি সাধারণ প্রশ্নে ব্যর্থ হতে দেখিনি, পোস্টগ্রেএসকিউএল ছাড়াই সারিগুলির ক্রম সম্পর্কিত কিছুই জোর করে না ORDER BY
। এটি বাস্তবায়নের বিশদের কারণে কাজ করে।
করতে পূরণবাচক সংখ্যা গ্যারান্টি ফাঁকা বিভাজিত উপাদানের স্ট্রিং :
SELECT id, arr[nr] AS elem, nr
FROM (
SELECT *, generate_subscripts(arr, 1) AS nr
FROM (SELECT id, string_to_array(elements, ' ') AS arr FROM tbl) t
) sub;
বা সরল যদি সত্যিকারের অ্যারের ভিত্তিতে থাকে :
SELECT id, arr[nr] AS elem, nr
FROM (SELECT *, generate_subscripts(arr, 1) AS nr FROM tbl) t;
ডিবিএএসই সম্পর্কিত সম্পর্কিত উত্তর:
পোস্টগ্রিজ 8.1 - 8.4
এই বৈশিষ্ট্যগুলির কোনটি এখনো পাওয়া যায়,: RETURNS TABLE
, generate_subscripts()
, unnest()
, array_length()
। তবে এটি কাজ করে:
CREATE FUNCTION f_unnest_ord(anyarray, OUT val anyelement, OUT ordinality integer)
RETURNS SETOF record
LANGUAGE sql IMMUTABLE AS
'SELECT $1[i], i - array_lower($1,1) + 1
FROM generate_series(array_lower($1,1), array_upper($1,1)) i';
বিশেষত দ্রষ্টব্য, অ্যারে সূচক উপাদানগুলির মূল অবস্থান থেকে পৃথক হতে পারে। একটি বর্ধিত ফাংশন সহ এই ডেমোটি বিবেচনা করুন :
CREATE FUNCTION f_unnest_ord_idx(anyarray, OUT val anyelement, OUT ordinality int, OUT idx int)
RETURNS SETOF record
LANGUAGE sql IMMUTABLE AS
'SELECT $1[i], i - array_lower($1,1) + 1, i
FROM generate_series(array_lower($1,1), array_upper($1,1)) i';
SELECT id, arr, (rec).*
FROM (
SELECT *, f_unnest_ord_idx(arr) AS rec
FROM (VALUES (1, '{a,b,c}'::text[])
, (2, '[5:7]={a,b,c}')
, (3, '[-9:-7]={a,b,c}')
) t(id, arr)
) sub;
id | arr | val | ordinality | idx
1 | {a,b,c} | a | 1 | 1
1 | {a,b,c} | b | 2 | 2
1 | {a,b,c} | c | 3 | 3
2 | [5:7]={a,b,c} | a | 1 | 5
2 | [5:7]={a,b,c} | b | 2 | 6
2 | [5:7]={a,b,c} | c | 3 | 7
3 | [-9:-7]={a,b,c} | a | 1 | -9
3 | [-9:-7]={a,b,c} | b | 2 | -8
3 | [-9:-7]={a,b,c} | c | 3 | -7
তুলনা করা: