2012-06-27 8 views
9

में सशर्त रूप से तालिका के एकाधिक कॉलम अपडेट करें मेरे पास एक तालिका है जिसमें कॉलम name, client_name और requester_name शामिल हैं। मुझे "माइक" से "माइकल" तक इन कॉलम के मानों को अपडेट करने की आवश्यकता है।एक कमांड

name | client_name | requester_name 
------+-------------+---------------- 
Mic | Jerry  | Jack 
Jack | Mic   | Mic 
Jerry | Jack  | Mic 

मैं निम्न क्वेरी की कोशिश की:

UPDATE names 
SET name='Michael', client_name='Michael', requester_name='Michael' 
WHERE name='Mic' OR client_name='Mic' OR requester_name='Mic'; 

इस क्वेरी सभी स्तंभों सभी के नाम करने के लिए 'माइकल' को बदलने के लिए बनाता है

यहाँ कुछ अभिलेख अद्यतन किया जाना चाहिए रहे हैं।
क्वेरी को केवल लागू होने वाले परिवर्तनों को लागू करने की तरह दिखना चाहिए?

+0

बेशक यह करता है, क्योंकि आपने 'SET' खंड में सभी कॉलम सूचीबद्ध किए हैं। –

+0

क्या कोई कारण है कि इसे 3 (प्रत्येक कॉलम के लिए 1) के बजाय एक कथन होना चाहिए? – tmpearce

+0

@tmpearce हां, समान स्थिति वाले कई तालिकाओं हैं जहां विशिष्ट स्थिति पर मूल्यों को बदला जाना चाहिए। और मुझसे बहुत कम प्रश्न उत्पन्न नहीं करने के लिए कहा गया था :( – Dragon

उत्तर

11

यह एक WHERE खंड जोड़ने के लिए बुद्धिमान होगा।

UPDATE names 
SET name = CASE WHEN name = 'Mic' THEN 'Michael' ELSE name END 
     ,client_name = CASE WHEN client_name = 'Mic' THEN 'Michael' 
        ELSE client_name END 
     ,requester_name = CASE WHEN requester_name = 'Mic' THEN 'Michael' 
         ELSE requester_name END 
WHERE 'Mic' IN (name, client_name, requester_name); 

अन्य, पूरी तालिका बिना शर्त अपडेट की जाएगी। अपडेट जो मान को एक ही मान में बदलते हैं, वे अभी भी मृत पंक्तियों को बनाने, ट्रिगर्स को ट्रिगर करने और अन्य अपडेट करने के अपडेट हैं। जबकि परिणामस्वरूप पंक्तियां गलत नहीं होंगी, फिर भी यह तालिका को आकार में दोगुना कर देगा, जिससे VACUUM आवश्यक हो, और आमतौर पर बहुत धीमी हो।

बीटीडब्ल्यू, CASE कथन का कोई भी रूप यहां अच्छा है।

1

बहुत, सुरुचिपूर्ण नहीं बहुत ही कुशल नहीं है, लेकिन एक क्वेरी में:

UPDATE names SET 
name = CASE name 
    WHEN 'Mic' THEN 'Micheal' ELSE name END, 
client_name = CASE client_name 
    WHEN 'Mic' THEN 'Micheal' ELSE client_name END, 
requester_name= CASE requester_name 
    WHEN 'Mic' THEN 'Micheal' ELSE requester_name END ; 

इस संक्षिप्त (Postgresql विशिष्ट) CASE की सिंटैक्स का उपयोग करता।

(BTW: मुझे लगता है कि आप के बजाय 'माइकल' के 'माइकल' का मतलब?)

+2

वह CASE वाक्यविन्यास PostgreSQL विशिष्ट नहीं है। यह मानक SQL है –

+0

@a_horse_with_no_name धन्यवाद, निश्चित – leonbloy

संबंधित मुद्दे