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

Psql में सीटीई के साथ एक चयन क्वेरी के लिए लूप कैसे चलाएं और यदि मैं इसे केवल-पढ़ने के लिए डीबी में चलाता हूं तो आउटपुट दिखाया जाता है?

अगर मैं इस अधिकार को समझता हूं, तो आप मूल रूप से उन सभी लोगों का चयन करना चाहते हैं जहां अवरोही आईडी के अनुसार पंक्ति संख्या पते में दिखाई देती है। तब अंतिम परिणाम इन पंक्ति संख्याओं में से कुछ तक सीमित होना चाहिए।

फिर आपको उस बोझिल LIMIT . का उपयोग करने की आवश्यकता नहीं है /OFFSET बिल्कुल निर्माण। आप बस row_number() . का उपयोग कर सकते हैं विंडो फ़ंक्शन।

पंक्ति संख्याओं को फ़िल्टर करने के लिए आप बस IN . का उपयोग कर सकते हैं . आप जो चाहते हैं उसके आधार पर आप या तो अक्षर की सूची का उपयोग कर सकते हैं, खासकर यदि संख्याएं लगातार नहीं हैं। या आप generate_series() . का उपयोग कर सकते हैं लगातार संख्याओं की सूची बनाने के लिए। बेशक आप एक सबक्वेरी का भी उपयोग कर सकते हैं, जब नंबर किसी अन्य तालिका में संग्रहीत होते हैं।

शाब्दिकों की सूची के साथ जो कुछ इस तरह दिखाई देंगे:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
       WHERE pn.address LIKE concat('%', pn.n, '%')
             AND pn.n IN (1, 2, 4);

यदि आप generate_series() का उपयोग करना चाहते हैं एक उदाहरण होगा:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
       WHERE pn.address LIKE concat('%', pn.n, '%')
             AND pn.n IN (SELECT s.n
                                 FROM generate_series(1, 3) s (n));
                             

और किसी अन्य तालिका की एक उपश्रेणी का उपयोग इस प्रकार किया जा सकता है:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
       WHERE pn.address LIKE concat('%', pn.n, '%')
             AND pn.n IN (SELECT t.nmuloc
                                 FROM elbat t);

संख्याओं के बड़े सेट के लिए आप INNER JOIN . का उपयोग करने पर भी विचार कर सकते हैं IN . के बजाय नंबरों पर ।

generate_series() का उपयोग करना :

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
            INNER JOIN generate_series(1, 1000000) s (n)
                       ON s.n = pn.n
       WHERE pn.address LIKE concat('%', pn.n, '%');

या जब संख्याएँ किसी अन्य तालिका में हों:

SELECT pn.personid,
       pn.lastname,
       pn.firstname,
       pn.address,
       pn.city
       FROM (SELECT p.personid,
                    p.lastname,
                    p.firstname,
                    p.address,
                    p.city,
                    row_number() OVER (ORDER BY p.personid DESC) n
                    FROM persons p) pn
            INNER JOIN elbat t
                       ON t.nmuloc = pn.n
       WHERE pn.address LIKE concat('%', pn.n, '%');

ध्यान दें कि मैंने रेगुलर एक्सप्रेशन पैटर्न मिलान को एक साधारण LIKE . से भी बदल दिया है . यह प्रश्नों को थोड़ा और पोर्टेबल बना देगा। लेकिन आप निश्चित रूप से इसे किसी भी अभिव्यक्ति से बदल सकते हैं जिसकी आपको वास्तव में आवश्यकता है।

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. डॉकर वॉल्यूम का उपयोग कर डेटाबेस को कायम रखना

  3. क्वेरी जहां विदेशी कुंजी कॉलम NULL हो सकता है

  4. Django कस्टम अद्वितीय एक साथ बाधा

  5. एक विशिष्ट कॉलम के अपडेट के बाद PostgreSQL ट्रिगर