WITH ORDINALITY
Postgres 9.4 বা তারপরে
নতুন বৈশিষ্ট্যটি এই শ্রেণীর সমস্যাগুলিকে সহজতর করে। উপরের ক্যোয়ারী এখন সহজভাবে হতে পারে:
SELECT *
FROM regexp_split_to_table('I think Postgres is nifty', ' ') WITH ORDINALITY x(word, rn);
বা, একটি টেবিল প্রয়োগ করা:
SELECT *
FROM tbl t, regexp_split_to_table(t.my_column, ' ') WITH ORDINALITY x(word, rn);
বিবরণ:
অন্তর্ভুক্ত LATERAL
যোগদান সম্পর্কে :
9.3 বা তার বেশি বয়সে পোস্টগ্র্যাগ করে - এবং আরও সাধারণ ব্যাখ্যা
একটি একক স্ট্রিং জন্য
row_number()
উপাদানগুলির ক্রম মনে রাখতে আপনি উইন্ডো ফাংশন প্রয়োগ করতে পারেন । তবে, সাধারণের সাথে row_number() OVER (ORDER BY col)
আপনি সাজানোর ক্রম অনুসারে সংখ্যাগুলি পান, স্ট্রিংয়ের মূল অবস্থানটি নয় ।
আপনি ORDER BY
"যেমন" অবস্থানটি পেতে কেবল বাদ দিতে পারেন:
SELECT *, row_number() OVER () AS rn
FROM regexp_split_to_table('I think Postgres is nifty', ' ') AS x(word);
regexp_split_to_table()
দীর্ঘ স্ট্রিং সহ অবক্ষয়ের কার্যকারিতা । unnest(string_to_array(...))
স্কেল আরও ভাল:
SELECT *, row_number() OVER () AS rn
FROM unnest(string_to_array('I think Postgres is nifty', ' ')) AS x(word);
যাইহোক, এটি সাধারণত কার্যকরভাবে কাজ করে এবং আমি কখনও এটিকে সাধারণ প্রশ্নগুলিতে ভাঙ্গতে দেখিনি, পোস্টগ্রিস কোনও স্পষ্ট ছাড়াই সারিগুলির ক্রমানুসারে কিছুই দাবি করে না ORDER BY
।
মূল স্ট্রিংয়ের মৌলিক সংখ্যক উপাদানের গ্যারান্টি রাখতে , ব্যবহার করুন generate_subscript()
(@ ডেসো দ্বারা মন্তব্য সহ উন্নত):
SELECT arr[rn] AS word, rn
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM string_to_array('I think Postgres is nifty', ' ') AS x(arr)
) y;
স্ট্রিংয়ের টেবিলের জন্য
যোগ PARTITION BY id
করার জন্য OVER
ধারা ...
ডেমো টেবিল:
CREATE TEMP TABLE strings(string text);
INSERT INTO strings VALUES
('I think Postgres is nifty')
,('And it keeps getting better');
আমি ctid
একটি প্রাথমিক কীটির অ্যাড-হক বিকল্প হিসাবে ব্যবহার করি । আপনার যদি একটি (বা কোনও অনন্য কলাম ) থাকে তবে পরিবর্তে এটি ব্যবহার করুন।
SELECT *, row_number() OVER (PARTITION BY ctid) AS rn
FROM (
SELECT ctid, unnest(string_to_array(string, ' ')) AS word
FROM strings
) x;
এই কোন স্বতন্ত্র আইডি ছাড়া কাজ করে:
SELECT arr[rn] AS word, rn
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM (
SELECT string_to_array(string, ' ') AS arr
FROM strings
) x
) y;
এসকিউএল ফিডল।
প্রশ্নের উত্তর
SELECT z.arr, z.rn, z.word, d.meaning -- , partofspeech -- ?
FROM (
SELECT *, arr[rn] AS word
FROM (
SELECT *, generate_subscripts(arr, 1) AS rn
FROM (
SELECT string_to_array(string, ' ') AS arr
FROM strings
) x
) y
) z
JOIN dictionary d ON d.wordname = z.word
ORDER BY z.arr, z.rn;