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;