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

पोस्टग्रेएसक्यूएल फ़ंक्शन से चुनें जो समग्र प्रकार लौटाता है

9.3 या बाद के संस्करण पोस्ट करें

एक LATERAL शामिल हों!

SELECT p.id, p.name, p.data, f.*
FROM   tb_projects p
LEFT   JOIN LATERAL fn_getlinkedproject(p.id) f(linked_id, lined_name) ON TRUE;

परिणाम:

 id |  data  |  name  | linked_id | linked_name
----+--------+--------+-----------+-------------
  1 | data_1 | name_1 |         2 | name_2
  2 | data_2 | name_2 |         3 | name_3
  3 | data_3 | name_3 |         1 | name_1

देखें:

9.2 या पुराने को पोस्ट करें

कई कारणों से नीचा। कॉलम उपनाम संलग्न करना उतना आसान नहीं है। इसके बजाय अन्य परस्पर विरोधी नामों का नाम बदलें:

SELECT p.id AS p_id, p.data AS p_data, p.name AS p_name, (fn_getlinkedproject(p.id)).*
FROM   tb_projects p;

परिणाम:

 p_id | p_data | p_name | id |  name
------+--------+--------+----+--------
    1 | data_1 | name_1 |  2 | name_2
    2 | data_2 | name_2 |  3 | name_3
    3 | data_3 | name_3 |  1 | name_1

नाम बदलें के लिए परिणाम कॉलम, आपको करने होंगे:

SELECT p.id, p.data, p.name
     ,(fn_getlinkedproject(p.id)).id   AS linked_id
     ,(fn_getlinkedproject(p.id)).name AS linked_name
FROM   tb_projects p;

दोनों पुराने समाधान फ़ंक्शन को बार-बार कॉल करने की एक ही (खराब) क्वेरी योजना का समाधान करते हैं।

इससे बचने के लिए, एक सबक्वेरी का उपयोग करें:

SELECT p.id, p.data, p.name
    , (p.x).id AS linked_id, (p.x).name AS linked_name
FROM  (SELECT *, fn_getlinkedproject(id) AS x FROM tb_projects) p;

आवश्यक कोष्ठक . की नियुक्ति पर ध्यान दें .
मिश्रित प्रकारों के बारे में मैनुअल पढ़ें ।

डेमो

CREATE TYPE dm_nameid AS (
  id   int
, name text); -- types simplified for demo

CREATE TABLE tb_projects(
  id   int
, data text
, name text);

INSERT INTO tb_projects VALUES
  (1, 'data_1', 'name_1')
, (2, 'data_2', 'name_2')
, (3, 'data_3', 'name_3');

CREATE function fn_getlinkedproject(integer)  -- avoiding CaMeL-case for demo
  RETURNS dm_nameid LANGUAGE sql AS
'SELECT id, name FROM tb_projects WHERE id = ($1 % 3) + 1';

db<>fiddle यहां




  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. कैसे सिंह () PostgreSQL में काम करता है

  3. Postgresql 8.2 में नेस्टेड लेनदेन?

  4. Psql में, कुछ कमांड का कोई प्रभाव क्यों नहीं पड़ता है?

  5. Jsonb (PostgreSQL) का उपयोग करके, मैं एक निश्चित मान के साथ आइटम कैसे पुनर्प्राप्त कर सकता हूं जो एक सरणी के रूप में सहेजा गया है?