অরক্ষিত অ্যারেতে উপাদানগুলির মূল ক্রমটি কীভাবে সংরক্ষণ করবেন?


19

স্ট্রিং দেওয়া:

'আমি মনে করি পোস্টগ্রিসএসকিউএল নিফটি'

আমি সেই স্ট্রিংয়ের মধ্যে পাওয়া পৃথক শব্দগুলিতে পরিচালনা করতে চাই। মূলত, আমার একটি পৃথক রয়েছে যা থেকে আমি শব্দের বিবরণ পেতে পারি এবং এই অভিধানটিতে সেই স্ট্রিংয়ের একটি অনিবদ্ধ অ্যারে যোগদান করতে চাই।

এখন পর্যন্ত আমার কাছে রয়েছে:

select word, meaning, partofspeech
from unnest(string_to_array('I think that PostgreSQL is nifty',' ')) as word
from table t
join dictionary d
on t.word = d.wordname;

এটি আমি যা করার আশা করছিলাম তার মৌলিক বিষয়গুলি পূরণ করে, তবে এটি মূল শৃঙ্খলা সংরক্ষণ করে না।

সম্পর্কিত প্রশ্ন:
পোস্টগ্রিজ এসকিউএল আনন্স্টেড () উপাদান নম্বর সহ


আপনি কি একটি স্ট্রিং বা স্ট্রিংয়ের পুরো টেবিলটি প্রসেস করতে চান ? যদি তা হয়, সারণীতে একটি প্রাথমিক কী আছে?
এরউইন ব্র্যান্ডসটেটার

@ এরউইন ব্র্যান্ডসটেটার একটি টেবিলের একটি স্ট্রিং (
এটিতে

উত্তর:


24

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;

1
এছাড়াও আপনি পিজি এর করা বিচিত্র SRF-ইন-নির্বাচন-তালিকা আচরণ কাজে লাগান পারেন: SELECT generate_series(1,array_length(word_array,1)), unnest(word_array) FROM ....। 9.3 এর LATERALএই সমস্যার উত্তম সমাধান সরবরাহ করতে পারে।
ক্রেগ রিঞ্জার

2
generate_subscripts(arr, 1)পরিবর্তে কাজ করবে না generate_series(1, array_upper(arr, 1))? আমি স্পষ্টতার জন্য পূর্বের পছন্দ করব।
dezso

1
@ ইরভিন আপনি কি Depesz থেকে অর্ডিনালিটির এই পোস্টটি দেখেছেন?
জ্যাক ডগলাস

1
@ জ্যাকডুগ্লাস: এটি হওয়ার সাথে সাথে আমরা শুক্রবার সম্পর্কিত একটি বিষয় নিয়ে আলোচনা করেছি , যা আমাকে একই ধরণের আবিষ্কারের দিকে নিয়ে যায়। আমি উত্তরে কিছুটা যুক্ত করেছি।
এরউইন ব্র্যান্ডস্টেটার

1
"বিশদ" এর লিঙ্কটি কেবল এই একই পৃষ্ঠায় লিঙ্ক করে। এটা বিভ্রান্তিকর।
ওয়াইল্ডকার্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.