UPDATE क्वेरी में कॉलम चुनने के लिए CASE का उपयोग करें?


13

मैं CASEएक SELECTप्रश्न (पोस्टग्रैज) में प्रदर्शित करने के लिए किस कॉलम का उपयोग कर सकता हूं , जैसे:

SELECT CASE WHEN val = 0 THEN column_x
            WHEN val = 1 THEN column_y
            ELSE 0
       END AS update, ...

क्या UPDATEPostgres में एक क्वेरी करते समय कुछ ऐसा ही संभव है (यानी कौन से कॉलम को अपडेट किया जाना चाहिए)? मुझे लगता है कि मुझे इस बारे में कुछ नहीं मिला, लेकिन हो सकता है कि किसी के पास एक चतुर विकल्प हो (इसके अलावा एक प्रक्रिया का उपयोग करके या प्रत्येक कॉलम को अपडेट करके CASEयह निर्धारित करने के लिए कि क्या स्तंभ के मूल्य को एक नया मूल्य सौंपा जाना चाहिए या बस मौजूदा को फिर से असाइन किया गया है मूल्य)। यदि कोई आसान विकल्प नहीं है, तो मैं निश्चित रूप से एक उत्तर के रूप में स्वीकार करता हूं।

अतिरिक्त जानकारी : मेरे मामले में मेरे पास 14 संभावित कॉलम हैं जिन्हें अपडेट किया जा सकता है, प्रति मिलान पंक्ति में केवल एक अपडेट किया जा रहा है (अपडेट की जाने वाली तालिका क्वेरी में दूसरे के साथ जुड़ जाती है)। अद्यतन करने के लिए पंक्तियों की मात्रा सबसे अधिक भिन्न होगी, दर्जनों या सैकड़ों हो सकती है। मेरा मानना ​​है कि सूचकांक में शामिल होने की स्थिति के लिए हैं।

जवाबों:


26

यदि आप निर्दिष्ट करते हैं कि एक कॉलम को अपडेट किया जाना चाहिए तो यह हमेशा अपडेट किया जाएगा, लेकिन आप सशर्त रूप से लगाए गए मान को बदल सकते हैं और अपनी शर्तों के आधार पर मूल मानों को वापस रख सकते हैं। कुछ इस तरह:

UPDATE some_table
SET    column_x = CASE WHEN should_update_x THEN new_value_for_x ELSE column_x END
     , column_y = CASE WHEN should_update_y THEN new_value_for_y ELSE column_y END
     , column_z = CASE WHEN should_update_z THEN new_value_for_z ELSE column_z END
FROM   ...

इसलिए यदि आप किसी विशेष कॉलम के अपडेट के लिए स्थितियां ठीक नहीं हैं, तो आप इसे वर्तमान मूल्य का वापस फीड कर सकते हैं।

ध्यान दें कि मिलान की गई प्रत्येक पंक्ति को एक अपडेट दिखाई देगा (भले ही सभी कॉलम उन मानों पर सेट हो रहे हों जो उनके पास पहले से हैं) जब तक कि आप इस स्थिति को स्पष्ट रूप से गेट ऑन नहीं करते हैं, जब तक कि आप ऑन और व्हेयर क्लॉज़ को फ़िल्टर नहीं करते हैं, जो एक प्रदर्शन समस्या हो सकती है (वहाँ हो सकती है एक लिखने के लिए, अनुक्रमित अद्यतन किया जाएगा, उपयुक्त ट्रिगर आग जाएगा, ...) अगर कम नहीं।


सब कुछ अपडेट होने के बारे में टिप के लिए धन्यवाद, अगर यह धीमा है, तो मुझे मल्टीपल अपडेट स्टेटमेंट्स के लिए @ कोलिन के हार्ट के सुझाव को लेना पड़ सकता है।
newenglander

आप यह सुनिश्चित कर सकते हैं कि आपके ऑन और WHERE क्लॉज़ सभी पंक्तियों को फ़िल्टर कर दें जहाँ कोई परिवर्तन आवश्यक नहीं है, लेकिन इसका मतलब यह हो सकता है कि SET क्लॉज़ और WHERE क्लॉज़ दोनों में आपकी सभी शर्तों को दोहराते रहें (जब तक कि एक सरल समग्र जाँच न हो संयुक्त उन सभी स्थितियों के बराबर 100% है)। उस बिंदु पर यह विधि अभी भी अधिक कुशल हो सकती है, लेकिन एकाधिक अपडेट विधि को बनाए रखना आसान हो सकता है।
डेविड स्पिललेट

इस बात से भी अवगत रहें कि एक कॉलम को उसी मान में अपडेट करने से रीडो
कॉलिन के हार्ट हार्ट

@ कोलिन: ऐ, कोई भी अपडेट डीबी के लेन-देन लॉग से होकर गुजरेगा, जिसमें अपडेट नो-अप्स भी हैं, जो अपडेट होने वाले फ़ील्ड्स के कारण वही मान हैं जो पहले थे। साथ ही साथ तत्काल प्रदर्शन की समस्या के लिए यह एक महत्वपूर्ण कारक हो सकता है यदि प्रतिकृति, अंतर बैकअप, लॉग शिपिंग और आगे का उपयोग कर रहे हैं, क्योंकि अतिरिक्त पंक्ति अद्यतन कार्रवाई उन लोगों के लिए आवश्यक स्थान / बैंडविड्थ को बढ़ाएगी।
डेविड स्पिललेट

युक्तियों के लिए आप दोनों को धन्यवाद, मेरे मामले में एकल अपडेट स्टेटमेंट ने ठीक काम किया।
newenglander

5

आपके पास अपडेट करने के लिए कॉलम के कितने अलग-अलग संयोजन हैं? संपूर्ण तालिका की कितनी पंक्तियों को अपडेट किया जाएगा? क्या अद्यतन करने के लिए पंक्तियों की तीव्र पहुंच के लिए अनुक्रमित हैं?

इन सवालों के जवाबों के आधार पर, आप कई अपडेट स्टेटमेंट्स को निष्पादित करने में सक्षम हो सकते हैं, प्रत्येक कॉलम के लिए एक जिसे आप अपडेट करना चाहते हैं और उस कॉलम के मूल्य पर उस स्थिति को रखें जहां अपडेट का क्लॉज हो ताकि शून्य पंक्तियों को अपडेट किया जाए यदि वह कॉलम गलत मान है।

कोशिश करें और सेट-बेस्ड सोचें, मान लें कि अपडेट को प्राथमिक कुंजी द्वारा मिली एकल पंक्ति को अपडेट करने की आवश्यकता नहीं है।


जवाब के लिए धन्यवाद। मैंने अपने प्रश्न में कुछ और जानकारी जोड़ी है, मुझे आशा है कि यह समझ में आएगा। यह कई अपडेट स्टेटमेंट्स के साथ एक अच्छा विकल्प है (मैं एक अपडेट स्टेटमेंट पसंद करूंगा, लेकिन मुझे लगता है कि वहां एक फायदा है)।
newenglander

यह वह उत्तर हो सकता है जिसकी मैं तलाश कर रहा हूं, लेकिन क्या आप अपडेट कॉलम_x = new_value_for_x को डालना चाहते हैं, जहां @val = 0. मैं ऐसा कुछ प्रयोग कर सकता हूं। अजीब लग रहा है। अगर वैल = 0 अपडेट कॉलम_x = new_value_for_x आदि को शुरू करना आसान नहीं है
कैशबैक

-1
update Practicing  -- table you will be updating
 set email = case -- column you will be updating
    when FName = 'Glenn' then 'Ace@Assasin.com'
       when FName = 'Riddick' then 'fallguy@Drunk.com'
       when FName = 'Jeffrey' then 'sorcerer@wizcom'
       else email
    end

यह सिर्फ एक कॉलम को अपडेट करता है, जबकि पूछने वाला यह जानना चाहता है कि स्थितियों के आधार पर विभिन्न कॉलम को कैसे अपडेट किया जाए।
कॉलिन टी हार्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.