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

आप एक संघनित PostgreSQL पंक्ति को अलग-अलग स्तंभों में कैसे विस्तारित कर सकते हैं?

9.3 और ऊपर:पार्श्व क्वेरी

PostgreSQL 9.3 या नए में एक अंतर्निहित पार्श्व क्वेरी का उपयोग करें:

SELECT f.* FROM things t, some_function(t.thing_id) f;

सभी नई क्वेरी . के लिए इस फॉर्मूलेशन को प्राथमिकता दें . उपरोक्त मानक सूत्रीकरण . है ।

यह उन कार्यों के साथ भी ठीक से काम करता है जो RETURNS TABLE या RETURNS SETOF RECORD साथ ही आउट-पैरा के साथ काम करता है जो RETURNS RECORD

यह इसके लिए आशुलिपि है:

SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;

पूर्व-9.3:वाइल्डकार्ड विस्तार (सावधानी से)

पिछले संस्करण, some_function . के बहु-मूल्यांकन का कारण बनते हैं , नहीं . करता है काम अगर some_function एक सेट देता है, इसका उपयोग न करें :

SELECT (some_function(thing_id)).* FROM things;

पिछले संस्करण, some_function . के बहु-मूल्यांकन से बचाते हैं अप्रत्यक्ष की दूसरी परत का उपयोग करना। इसका उपयोग केवल तभी करें जब आपको PostgreSQL के काफी पुराने संस्करणों का समर्थन करना चाहिए।

SELECT (f).*
FROM (
  SELECT some_function(thing_id) f
  FROM things
) sub(f);

डेमो:

सेटअप:

CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
  RAISE NOTICE 'evaluated with %',i;
  x := i;
  y := i::text;
  z := 'dummy';
  RETURN;
END;
$$;

create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);

टेस्ट रन:

demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>     SELECT (some_function(thing_id)).* FROM things;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>  SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सभी वर्षों में दिनांक सीमा (एक ही महीने और दिन) के अनुसार फ़िल्टर करें

  2. शामिल नहीं हो सकता और अगली कड़ी में चयन नहीं कर सकता -- PG::SyntaxError

  3. SQL डोमेन त्रुटि:कॉलम मौजूद नहीं है, डिफ़ॉल्ट सेटिंग

  4. Postgresql:फ़ाइल तक नहीं पहुँच सकता « $libdir/postgis-2.1» ऐसी कोई फ़ाइल या निर्देशिका नहीं

  5. Postgresql ट्रंकेशन स्पीड