मैं जूनियर वेब डेवलपर हूं। मैं पोस्टग्रेज के बारे में अध्ययन कर रहा हूं, और मेरे पास केस स्टेटमेंट के उपयोग के मामले के बारे में एक प्रश्न है।

यह क्वेरी डेटा के साथ कई पंक्तियों को ढूंढती है जो किसी विशेष शब्द से सबसे अधिक निकटता से मेल खाते हैं।

परिणाम एकाधिक हो सकता है।

इस क्वेरी में, रैंकिंग मान की गणना प्रत्येक पंक्ति के लिए समानता के अनुसार केस स्टेटमेंट का उपयोग करके की जाती है।

यह समझा जाता है कि केस स्टेटमेंट एक मान देता है जो प्रत्येक निष्पादन से मेल खाता है।

जब केस स्टेटमेंट का उपयोग मिन और विंडो फ़ंक्शंस के अंदर किया जाता है, तो मुझे आश्चर्य होता है कि परिणाम कैसे प्राप्त करें।

दी गई तालिका पोस्टल कोड है..

|---------------------|------------------|
|       pcode         |       name       |
|---------------------|------------------|
|       100456        |        a         |
|---------------------|------------------|
|       111343        |        b         |
|---------------------|------------------|
|       101334        |        c         |
|---------------------|------------------|
|       100567        |        d         |
|---------------------|------------------|
|       102234        |        e         |
|---------------------|------------------|

सवाल है..

SELECT pcode,
       name
  FROM (SELECT pcode,
               name,
                 CASE WHEN pcode = '100123' THEN 0
                      WHEN pcode = '10012%' THEN 1
                      WHEN pcode = '1001%'  THEN 2
                      WHEN pcode = '100%'   THEN 3
                      WHEN pcode = '10%'    THEN 4
                      WHEN pcode = '1%'     THEN 5
                      ELSE NULL END AS hit_code,    
                 MIN(CASE WHEN pcode = '100123' THEN 0 
                          WHEN pcode = '10012%' THEN 1
                          WHEN pcode = '1001%'  THEN 2
                          WHEN pcode = '100%'   THEN 3
                          WHEN pcode = '10%'    THEN 4
                          WHEN pcode = '1%'     THEN 5
                          ELSE NULL END)
                 OVER(ORDER BY CASE WHEN pcode = '100123' THEN 0
                                    WHEN pcode = '10012%' THEN 1
                                    WHEN pcode = '1001%'  THEN 2
                                    WHEN pcode = '100%'   THEN 3
                                    WHEN pcode = '10%'    THEN 4
                                    WHEN pcode = '1%'     THEN 5
                                    ELSE NULL END) AS min_code,
         FROM PostalCODE) Foo
WHERE hit_code = min_code;  

और परिणाम होगा

|---------------------|------------------|
|       pcode         |       name       |
|---------------------|------------------|
|       100456        |        a         |
|---------------------|------------------|
|       100567        |        d         |
|---------------------|------------------|

मुझे पता है कि पहला केस स्टेटमेंट समानता के आधार पर अलग-अलग मान देता है।

केस खत्म होने के बाद, MIN फ़ंक्शन को कॉल किया जाता है, लेकिन यह क्या लौटाएगा?

मैं इस संदर्भ को नहीं समझ सकता।

क्रिप्या मेरि सहायता करे।

यदि आप मेरी मदद करते हैं, तो मैं आपको कुछ नहीं दे सकता, लेकिन मैं अपनी हार्दिक कृतज्ञता व्यक्त करना चाहता हूं।

पढ़ने के लिए धन्यवाद।

1
kk jj 3 मार्च 2020, 19:06
वे केस एक्सप्रेशन हैं।
 – 
jarlh
3 मार्च 2020, 19:07
मुझे बताने के लिए धन्यवाद
 – 
kk jj
3 मार्च 2020, 19:24

2 जवाब

आपका केस एक्सप्रेशन किसी दिए गए p_code और एक निश्चित कोड के बीच समानता की जांच करता है, और hit_code, 0 (उच्चतम समानता) और 5 (सबसे कम समानता), या null (नहीं) के बीच का मान देता है। बिल्कुल समानता)।

विंडो फ़ंक्शन min() over() पूरे डेटासेट पर एक ही ऑपरेशन करता है: यह आपको पूरी तालिका के लिए न्यूनतम hit_code देता है।

अंत में, बाहरी क्वेरी उन रिकॉर्ड (रिकॉर्डों) पर फ़िल्टर करती है जिनमें न्यूनतम hit_code (अर्थात उच्चतम समानता) होती है।

कोड के साथ संभावित समस्याएं:

  • विंडो फ़ंक्शन में एक खाली over() क्लॉज होना चाहिए (जो order by मदद नहीं करता है)

  • पैटर्न मिलान के लिए = के बजाय ऑपरेटर like की आवश्यकता है

ध्यान दें कि सीधे रैंकिंग फ़ंक्शन का उपयोग करके कोड को छोटा किया जा सकता है:

select pcode, name
from (
    select
        t.*,
        rank() over(
            order by case
                when pcode = '100123' then 0
                when pcode like '10012%' then 1
                when pcode like '1001%'  then 2
                when pcode like '100%'   then 3
                when pcode like '10%'    then 4
                when pcode like '1%'     then 5
                else null 
            end)
        as hit_rank
    from mytable t
) t
where hit_rank = 1
0
GMB 3 मार्च 2020, 19:31
जवाब देने के लिए धन्यवाद। इससे बहुत मदद मिली! क्या इस 'हिट_रैंक = 1' कथन का अर्थ यह है कि केवल 1 के हिट_रैंक मान वाले मान को ही अंततः वापस किया जाएगा?
 – 
kk jj
4 मार्च 2020, 22:16
@kkjj: मूल क्वेरी की तरह, यह आपको वह रिकॉर्ड देता है जिसमें सबसे अच्छी समानता है (संबंध शामिल हैं)। मुझे लगता है कि आप जो चाहते हैं उसे करने का यह सबसे आसान तरीका है। आप इसे अपने वास्तविक डेटा के विरुद्ध आज़मा सकते हैं।
 – 
GMB
4 मार्च 2020, 22:27

यदि आप केवल एक पंक्ति चाहते हैं, तो यह इतना आसान होगा जितना:

SELECT pcode, name
FROM PostalCODE pc CROSS JOIN LATERAL
     (CASE WHEN pcode = '100123' THEN 0
           WHEN pcode = '10012%' THEN 1
           WHEN pcode = '1001%'  THEN 2
           WHEN pcode = '100%'   THEN 3
           WHEN pcode = '10%'    THEN 4
           WHEN pcode = '1%'     THEN 5
      END) v(hit_code)
ORDER BY hit_code ASC 
LIMIT 1;
0
Gordon Linoff 3 मार्च 2020, 19:32