मैं सोच रहा था कि PostgreSQL फ़ंक्शन के पैरामीटर के रूप में परिणाम सेट प्रदान करने का कोई तरीका है या नहीं। उत्तर शायद "नहीं" है, लेकिन यह पूछने में कोई हर्ज नहीं है। शायद इससे कुछ विचार निकल सकें।
मेरे पास सरल विज़ुअलाइज़ेशन उद्देश्यों के लिए एक परिणाम सेट को एक पेड़ के रूप में प्रारूपित करने का तर्क है और मैं इसे डेटाबेस में एक फ़ंक्शन (format_tree()
) के रूप में जोड़ना चाहता था।
उदाहरण के लिए यदि कोई परिणाम सेट लौटाता है:
id parent_id title
-- --------- --------------
1 null Animal
2 1 Mammal
3 1 Bird
4 3 Eagle
5 2 Marsupial
6 5 Cangaroo
तर्क वर्तमान में इसे इस प्रकार प्रारूपित कर सकता है:
+- Animal
+- Mammal
| +- Marsupial
| +- Cangaroo
+- Bird
+- Eagle
कोई भी SQL सिंटैक्स कर सकता है (उम्मीद है कि एक साधारण)। शायद कुछ ऐसा:
select *
from (
format_tree(
select a as id, b as parent_id, c as title
from ...
where ...
)
) x
इस रिपोर्टिंग डेटाबेस के लिए मुझे इंजन चुनने की कुछ स्वतंत्रता है, इसलिए यदि किसी अन्य डेटाबेस (Oracle, DB2, SQL Server, MariaDB, आदि) के लिए कोई विचार है जो काम भी कर सकता है।
1 उत्तर
मुझे ऐसा करने में कोई बात नहीं दिख रही है, लेकिन आप पूर्व-परिभाषित प्रकार की एक सरणी पास कर सकते हैं:
create type tree_line
(
id integer,
parent_id integer,
title text
);
फिर आप उस फ़ंक्शन को परिभाषित कर सकते हैं जो उस प्रकार की सरणी स्वीकार करता है:
create function format_tree(p_data tree_line[])
returns table (line text)
as
$$
...
$$
और इसे इस तरह कहते हैं:
select *
from format_tree(array(select (a, b, c)::tree_line
from ...
where ...));
एक अन्य विकल्प JSONB मान को "परिणाम सेट धारक" के रूप में उपयोग करना हो सकता है:
create function format_tree(p_data jsonb)
returns table (line text)
as
$$
...
$$
फिर इसे इस तरह इस्तेमाल करें:
select *
from format_tree((select jsonb_agg(t)
from (
select a as id, b as parent_id, c as text
from ...
) t
));
tree_line
प्रकार की आवश्यकता नहीं है।
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।
format_tree()
तर्क को डेटाबेस में ही एक प्रक्रिया/कार्य के रूप में संग्रहीत करना चाहता था यदि संभव हो तो।