PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

सामान्य क्वेरी को कॉलम के रूप में स्टोर करें?

<ब्लॉकक्वॉट>

क्या उस उप-चयन को तालिका में छद्म-स्तंभ के रूप में संग्रहीत करने का कोई तरीका है?

एक VIEW जैसे सलाह दी गई है एक पूरी तरह से वैध समाधान है। इसके लिए जाओ।

लेकिन एक और तरीका है जो आपके प्रश्न को और अधिक बारीकी से फिट करता है। आप एक ऐसा फ़ंक्शन लिख सकते हैं जो तालिका प्रकार को अनुकरण . करने के लिए पैरामीटर के रूप में लेता है एक "गणना की गई फ़ील्ड" या "जेनरेट किया गया कॉलम"

अपने विवरण से प्राप्त इस परीक्षण मामले पर विचार करें:

CREATE TABLE tbl_a (a_id int, col1 int, col2 int);
INSERT INTO tbl_a VALUES (1,1,1), (2,2,2), (3,3,3), (4,4,4);

CREATE TABLE tbl_b (b_id int, a_id int, colx int);
INSERT INTO tbl_b VALUES
  (1,1,5),  (2,1,5),  (3,1,1)
, (4,2,8),  (5,2,8),  (6,2,6)
, (7,3,11), (8,3,11), (9,3,11);

ऐसा फ़ंक्शन बनाएं जो col3 . का अनुकरण करता हो :

CREATE FUNCTION col3(tbl_a)
  RETURNS int8
  LANGUAGE sql STABLE AS
$func$
SELECT sum(colx)
FROM   tbl_b b
WHERE  b.a_id = $1.a_id
$func$;

अब आप क्वेरी कर सकते हैं:

SELECT a_id, col1, col2, tbl_a.col3
FROM   tbl_a;

या यहां तक ​​कि:

SELECT *, a.col3 FROM tbl_a a;

ध्यान दें कि मैंने कैसे लिखा tbl_a.col3 / a.col3 , न केवल col3 . यह आवश्यक है ।

Oracle में "वर्चुअल कॉलम" के विपरीत यह नहीं . है SELECT * FROM tbl_a . में स्वचालित रूप से शामिल . आप एक VIEW का उपयोग कर सकते हैं उसके लिए।

यह क्यों काम करता है?

तालिका कॉलम को संदर्भित करने का सामान्य तरीका विशेषता नोटेशन . के साथ है :

SELECT tbl_a.col1 FROM tbl_a;

किसी फ़ंक्शन को कॉल करने का सामान्य तरीका कार्यात्मक संकेतन . के साथ है :

SELECT col3(tbl_a);

आम तौर पर, इन प्रामाणिक तरीकों से चिपके रहना . सबसे अच्छा है , जो SQL मानक से सहमत हैं।

लेकिन Postgres विशेषता संकेतन की भी अनुमति देता है। ये भी काम करते हैं:

SELECT col1(tbl_a) FROM tbl_a;
SELECT tbl_a.col3;

इसके बारे में मैनुअल में और अधिक।
आप शायद अब तक देख चुके हैं कि यह कहां जा रहा है। यह दिखता है जैसे आप तालिका का एक अतिरिक्त कॉलम जोड़ेंगे tbl_a जबकि col3() वास्तव में एक फ़ंक्शन है जो tbl_a . की वर्तमान पंक्ति लेता है (या इसके उपनाम) पंक्ति प्रकार तर्क के रूप में और एक मान की गणना करता है।

SELECT *, a.col3
FROM   tbl_a AS a;

यदि कोई वास्तविक कॉलम है col3 यह प्राथमिकता लेता है और सिस्टम tbl_a पंक्ति लेते हुए उस नाम के फ़ंक्शन की तलाश नहीं करता है पैरामीटर के रूप में।

इसकी "सुंदरता":आप tbl_a . से कॉलम जोड़ या छोड़ सकते हैं और अंतिम क्वेरी गतिशील रूप से सभी मौजूदा कॉलम लौटाएगी, जहां एक दृश्य केवल ऐसे कॉलम लौटाएगा जो निर्माण समय पर मौजूद थे (प्रारंभिक बाध्यकारी बनाम * की देर से बाध्यकारी ).
बेशक, टेबल को अभी छोड़ने से पहले आपको डिपेंडिंग फंक्शन को छोड़ना होगा। और आपको ध्यान रखना होगा कि तालिका में परिवर्तन करते समय फ़ंक्शन को अमान्य न करें।

मैं अभी भी इसका इस्तेमाल नहीं करूंगा। मासूम पाठक के लिए यह बहुत आश्चर्यजनक है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql में मनमानी लंबाई के तारों को स्टोर करें

  2. बोली को स्पष्ट रूप से v4.0.0 . के रूप में आपूर्ति की जानी चाहिए

  3. PostgreSQL दिनांक और समय कार्य

  4. MYSQL में शर्तों के साथ अद्वितीय बाधा

  5. कई तालिकाओं में से एक के लिए विदेशी कुंजी?