अगर मैं इस अधिकार को समझता हूं, तो आप मूल रूप से उन सभी लोगों का चयन करना चाहते हैं जहां अवरोही आईडी के अनुसार पंक्ति संख्या पते में दिखाई देती है। तब अंतिम परिणाम इन पंक्ति संख्याओं में से कुछ तक सीमित होना चाहिए।
फिर आपको उस बोझिल 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 (कुछ प्रकारों के साथ)