PostgreSQL এ গণিত / গণনা / ভার্চুয়াল / উত্পন্ন কলাম


113

পোস্টগ্রিএসকিউএল এমএস এসকিউএল সার্ভারের মতো গণিত / গণনাকৃত কলামগুলি সমর্থন করে? আমি ডক্সে কিছু খুঁজে পাচ্ছি না, তবে এই বৈশিষ্ট্যটি অন্যান্য অনেক ডিবিএমএস-এর অন্তর্ভুক্ত হওয়ায় আমি ভেবেছিলাম যে আমার কোনও কিছু মিস হতে পারে।

উদাঃ http://msdn.microsoft.com/en-us/library/ms191250.aspx x


পার্শ্বীয় subquery এক্সপ্রেশন (Postgres বৈশিষ্ট্য) ব্যবহার করে আপনি প্রতিটি সারিতে সহজেই আরও কলাম যুক্ত করতে পারেন।
ভিক্টর

উত্তর:


139

পোস্টগ্র্রেস পর্যন্ত 11 টি উত্পাদিত কলামগুলি সমর্থিত নয় - এসকিউএল স্ট্যান্ডার্ডে সংজ্ঞায়িত হয়ে ডিবি 2, মাইএসকিউএল এবং ওরাকল সহ কিছু আরডিবিএমএস দ্বারা প্রয়োগ করা হয়েছে। অথবা এসকিউএল সার্ভারের অনুরূপ "গণিত কলাম"

STOREDউত্পন্ন কলামগুলি পোস্টগ্রিস 12 এর সাথে প্রবর্তিত হয় । তুচ্ছ উদাহরণ:

CREATE TABLE tbl (
  int1    int
, int2    int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);

ডিবি <> ফিডল এখানে

VIRTUALউত্পন্ন কলামগুলি পরবর্তী পুনরাবৃত্তির একটিতে আসতে পারে। (পোস্টগ্রিস ১৩ এ নেই, এখনও)।

সম্পর্কিত:


ততক্ষণ পর্যন্ত , আপনি কোনও ভার্চুয়াল উত্পন্ন কলামের মতো দেখতে এবং কাজ করে এমন বৈশিষ্ট্য স্বরলিপি ( ) ব্যবহার করে VIRTUALএকটি ফাংশন সহ উত্পন্ন কলামগুলি অনুকরণ করতে পারেন । এটি একটি সিনট্যাক্সের বিজোড়তা যা Postতিহাসিক কারণে পোস্টগ্র্রেসে বিদ্যমান এবং কেসটির সাথে মানিয়ে যায়। এই সম্পর্কিত উত্তরের কোড উদাহরণ রয়েছে :tbl.col

যদিও অভিব্যক্তিটি (কলামের মতো দেখাচ্ছে) একটিতে অন্তর্ভুক্ত নেই SELECT * FROM tbl। আপনাকে সর্বদা এটি সুস্পষ্টভাবে তালিকাবদ্ধ করতে হবে।

ম্যাচিং এক্সপ্রেশন ইনডেক্সের সাথেও সমর্থন করা যেতে পারে - প্রদত্ত ফাংশনটি IMMUTABLE। ভালো লেগেছে:

CREATE FUNCTION col(tbl) ... AS ...  -- your computed expression here
CREATE INDEX ON tbl(col(tbl));

বিকল্প

বিকল্পভাবে, আপনি VIEWঅভিব্যক্তি সূচকগুলির সাথে বিকল্পভাবে মিলিয়ে একটি সহ একই কার্যকারিতা প্রয়োগ করতে পারেন । তারপরে SELECT *উত্পন্ন কলামটি অন্তর্ভুক্ত করতে পারে।

"সিস্টেস্ট" ( STORED) গণিত কলামগুলি কার্যকরভাবে অভিন্ন উপায়ে ট্রিগারগুলির সাথে প্রয়োগ করা যেতে পারে ।

বস্তুগত দৃষ্টিভঙ্গি একটি নিবিড়ভাবে সম্পর্কিত ধারণা, পোস্টগ্রিস 9.3 থেকে কার্যকর করা হয়েছে
পূর্ববর্তী সংস্করণগুলিতে ম্যানুয়ালি এমভিগুলি পরিচালনা করতে পারে।


আপনি একবারে কতটা ডেটা লোড করছেন তার উপর নির্ভর করে .. ট্রিগার জিনিসগুলি মারাত্মকভাবে কমিয়ে দিতে পারে। পরিবর্তে আপডেটগুলি বিবেচনা করতে চাই।
সাম ইয়ে

1
ওরাকল থেকে পোস্টগ্রাসে স্থানান্তরিত করার সময় এই সমাধানগুলি বেশ বেহুদা (কোনও পরীক্ষার কেসবিহীন কোনও কোডবেজে বিশাল কোড পরিবর্তন ছাড়াই) are মাইগ্রেশন দৃষ্টিকোণ থেকে কোন সমাধান আছে?
হ্যাপিবুদ্ধ

@ হ্যাপীবুদ্ধ: আপনার প্রশ্নটি প্রশ্ন হিসাবে জিজ্ঞাসা করুন। মন্তব্য জায়গা নয়। আপনি সর্বদা প্রসঙ্গের জন্য এই প্রশ্নের লিঙ্ক করতে পারেন (এবং আমার মনোযোগ পেতে এবং সম্পর্কিত প্রশ্নের সাথে লিঙ্ক পেতে এখানে একটি মন্তব্য যুক্ত করুন)।
এরউইন ব্র্যান্ডসটেটার

4
কার্যকারিতা এখনই বিকাশে রয়েছে: কম্যফেস্ট.পোস্টগ্রেসকল.আর
r90t

1
@ ক্রিয়ানভু: আপনার সেটআপ এবং প্রয়োজনীয়তার বিবরণগুলির উপর নির্ভর করে। আপনি প্রয়োজনীয় তথ্য সহ একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন।
এরউইন ব্র্যান্ডস্টেটার

32

হ্যা, তুমি পারো!! সমাধানটি সহজ, নিরাপদ এবং পারফরম্যান্ট হওয়া উচিত ...

আমি পোস্টগ্রেস্কএল-এ নতুন, তবে মনে হচ্ছে আপনি একটি অভিব্যক্তি সূচক ব্যবহার করে গণিত কলাম তৈরি করতে পারবেন , একটি দর্শন দিয়ে যুক্ত ( দৃশ্যটি optionচ্ছিক, তবে জীবনকে কিছুটা সহজ করে তোলে)।

মনে করুন আমার গণনাটি হয় md5(some_string_field), তবে আমি সূচকটি এইভাবে তৈরি করি:

CREATE INDEX some_string_field_md5_index ON some_table(MD5(some_string_field));

এখন, যে কোনও প্রশ্নের উপরে কাজ করে MD5(some_string_field)তা সূচিটি স্ক্র্যাচ থেকে গণনার পরিবর্তে ব্যবহার করবে। উদাহরণ স্বরূপ:

SELECT MAX(some_field) FROM some_table GROUP BY MD5(some_string_field);

আপনি ব্যাখ্যা সহ এটি পরীক্ষা করতে পারেন ।

তবে এই মুহুর্তে আপনি কীভাবে কলামটি তৈরি করবেন তা জেনে টেবিলের ব্যবহারকারীদের উপর নির্ভর করছেন। জীবনকে সহজ করার জন্য, আপনি VIEWএকটি নতুন কলাম হিসাবে গণিত মান যুক্ত করে মূল টেবিলের একটি বাড়ানো সংস্করণে একটি তৈরি করতে পারেন :

CREATE VIEW some_table_augmented AS 
   SELECT *, MD5(some_string_field) as some_string_field_md5 from some_table;

এখন যে কোনও প্রশ্ন ব্যবহার করে এটি কীভাবে কাজ করে তা নিয়ে চিন্তা না করে some_table_augmentedব্যবহার করতে সক্ষম some_string_field_md5হবে .. তারা কেবল ভাল পারফরম্যান্স পান। ভিউটি মূল টেবিল থেকে কোনও ডেটা অনুলিপি করে না, সুতরাং এটি ভাল স্মৃতিশক্তির পাশাপাশি কর্মক্ষমতা অনুযায়ীও উপযুক্ত। তবে নোট করুন যে আপনি কেবলমাত্র উত্স টেবিলের মধ্যে কোনও দৃশ্যে আপডেট / সন্নিবেশ করতে পারবেন না, তবে আপনি যদি সত্যিই চান তবে আমার বিশ্বাস যে আপনি বিধিগুলি ব্যবহার করে উত্স টেবিলে সন্নিবেশ এবং আপডেটগুলি পুনর্নির্দেশ করতে পারবেন (আমি শেষ পয়েন্টে ভুল হতে পারি) আমি নিজে চেষ্টা করে দেখিনি)।

সম্পাদনা: দেখে মনে হচ্ছে যদি ক্যোয়ারিতে প্রতিদ্বন্দ্বী সূচকগুলি জড়িত থাকে তবে পরিকল্পনাকারী ইঞ্জিন কখনও কখনও এক্সপ্রেশন-সূচকটি মোটেই ব্যবহার করতে পারে না। পছন্দটি ডেটা নির্ভরশীল বলে মনে হচ্ছে।


1
আপনি দয়া করে ব্যাখ্যা বা একটি উদাহরণ দিতে পারেন if the query involves competing indices?
ডিভিটান

17

এটি করার একটি উপায় হ'ল ট্রিগার দিয়ে!

CREATE TABLE computed(
    one SERIAL,
    two INT NOT NULL
);

CREATE OR REPLACE FUNCTION computed_two_trg()
RETURNS trigger
LANGUAGE plpgsql
SECURITY DEFINER
AS $BODY$
BEGIN
    NEW.two = NEW.one * 2;

    RETURN NEW;
END
$BODY$;

CREATE TRIGGER computed_500
BEFORE INSERT OR UPDATE
ON computed
FOR EACH ROW
EXECUTE PROCEDURE computed_two_trg();

সারিটি আপডেট করা বা sertedোকানোর আগে ট্রিগারটি বহিস্কার করা হয়। এটি ক্ষেত্রটি পরিবর্তন করে যা আমরা NEWরেকর্ডের গণনা করতে চাই এবং তারপরে এটি সেই রেকর্ডটি ফিরিয়ে দেয়।


আকস্মিকভাবে ট্রিগার কখন আগুন দেয়? আমি উপরের দিকে দৌড়েছি insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;এবং এটি করেছি এবং এটি ঠিক ফিরে এসেছিল: 1 2 এবং 4 8
হ্যাপিবুদ্ধ

2
চেষ্টা insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;মান twoকলাম স্বয়ংক্রিয়ভাবেই আপনার গণনা করা হবে!
এলমার

8

পোস্টগ্রিএসকিউএল 12 উত্পন্ন কলামগুলিকে সমর্থন করে:

পোস্টগ্র্যাসএসকিউএল 12 বিটা 1 মুক্তি পেয়েছে!

উত্পাদিত কলামগুলি

পোস্টগ্রেএসকিউএল 12 জেনারেটেড কলামগুলি তৈরি করতে দেয় যা অন্যান্য কলামগুলির সামগ্রী ব্যবহার করে তাদের মানগুলিকে গণনা করে। এই বৈশিষ্ট্যটি সঞ্চিত উত্পন্ন কলামগুলি সরবরাহ করে, যা সন্নিবেশ এবং আপডেটগুলিতে গণনা করা হয় এবং ডিস্কে সংরক্ষণ করা হয়। ভার্চুয়াল উত্পন্ন কলামগুলি, যেগুলি কেবল তখনই গণনা করা হয় যখন কোনও কোয়েরির অংশ হিসাবে কলামটি পড়া হয়, তা এখনও প্রয়োগ করা হয় না।


উত্পাদিত কলামগুলি

উত্পন্ন কলাম হ'ল একটি বিশেষ কলাম যা সর্বদা অন্যান্য কলামগুলি থেকে গণনা করা হয়। সুতরাং, এটি কলামগুলির জন্য যা ভিউ টেবিলগুলির জন্য।

CREATE TABLE people (
    ...,
    height_cm numeric,
    height_in numeric GENERATED ALWAYS AS (height_cm * 2.54) STORED
);

ডিবি <> ফিডাল ডেমো



1

ঠিক আছে, নিশ্চিত না যে এটি আপনি যা বোঝাতে চেয়েছিলেন তা কিন্তু পোগ্রেস সাধারণত "ডামি" ইটিএল সিনট্যাক্স সমর্থন করে। আমি সারণীতে একটি খালি কলাম তৈরি করেছি এবং তারপরে সারি মানগুলির উপর নির্ভর করে গণনা করা রেকর্ডগুলি দ্বারা এটি পূরণ করা দরকার।

UPDATE table01
SET column03 = column01*column02; /*e.g. for multiplication of 2 values*/
  1. এটি এতটাই নকল যে আমি সন্দেহ করি এটি আপনি যা খুঁজছেন তা নয়।
  2. অবশ্যই এটি গতিশীল নয়, আপনি এটি একবার চালান run তবে এটি ট্রিগারে পেতে কোনও বাধা নেই।

0

আমার কাছে একটি কোড রয়েছে যা কাজ করে এবং গণনা করা শব্দটি ব্যবহার করে, আমি পোস্টগ্র্রেস এসকিউএল খাঁটিতে নেই যা আমরা পিএডিবিতে চালাই

এখানে এটি ব্যবহার করা হয়

create table some_table as
    select  category, 
            txn_type,
            indiv_id, 
            accum_trip_flag,
            max(first_true_origin) as true_origin,
            max(first_true_dest ) as true_destination,
            max(id) as id,
            count(id) as tkts_cnt,
            (case when calculated tkts_cnt=1 then 1 else 0 end) as one_way
    from some_rando_table
    group by 1,2,3,4    ;

পিএডিবি ঠিক কী?
গেরম্যান

ParAccel বিশ্লেষণমূলক ডাটাবেস এটা পুরাতন কিন্তু খুব ভালো ... en.wikipedia.org/wiki/ParAccel
Wired604

তবে পোস্টগ্রিস সম্পর্কে কোনও প্রশ্নের সাথে এটি কীভাবে সম্পর্কিত? অবশ্যই গণিত কলামগুলির সমর্থন সহ প্রচুর ডিবি রয়েছে।
গেরম্যান

আহ দুঃখিত আমি প্রসঙ্গে ফিরে আসতে সময় নিইনি .... পিএডিবি পোস্টগ্র্রেস ভিত্তিক!
তারযুক্ত 604

-6

চেক সীমাবদ্ধতার সাথে একটি হালকা ওজনের সমাধান:

CREATE TABLE example (
    discriminator INTEGER DEFAULT 0 NOT NULL CHECK (discriminator = 0)
);

6
এটি কীভাবে গণনা করা কলামের ধারণার সাথে সম্পর্কিত? আপনি ব্যাখ্যা করতে যত্ন নিতে হবে?
এরউইন ব্র্যান্ডসেটেটার

4
সম্মত, এটি সরাসরি সম্পর্কিত নয়। আপনার যখন কেবল কিছু করার দরকার হয় তবে এটি একটি সাধারণ ক্ষেত্রে প্রতিস্থাপন field as 1 persisted
সিনেমাও

2
একটি বিবরণ সত্যই দুর্দান্ত ছিল। আমি মনে করি এই উত্তরটি হ'ল যদি ডিফল্ট অনুচ্ছেদে যদি গণনা করা যায় তবে আপনি মান পরিবর্তন থেকে রোধ করতে আপনি একটি ডিফল্ট এবং একটি চেক সীমাবদ্ধতা ব্যবহার করতে পারেন।
রস ব্র্যাডবেরি

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