T-SQL: किसी शर्त के आधार पर कुछ कॉलम को अपडेट करने के लिए अपडेट स्टेटमेंट में CASE का उपयोग करना


108

मैं सोच रहा हूं कि क्या यह संभव है। यदि कोई शर्त सही है, तो मैं कॉलम x को अपडेट करना चाहता हूं, अन्यथा कॉलम y अपडेट किया जाएगा

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

मैंने सभी पर खोज की है, कुछ चीजों की कोशिश की है और एक समाधान खोजने में असमर्थ हूं। मुझे लगता है कि यह संभव नहीं है, लेकिन मुझे लगा कि मैं यहां पूछूंगा और देखूंगा कि क्या किसी ने पहले किया है। अग्रिम में धन्यवाद।


सभी को एक ही तालिका में मानते हुए, हाँ। आप हमेशा इसे लेन-देन में चला सकते हैं, और अपने आप को देखने के लिए, त्रुटि पर रोलबैक कर सकते हैं।
OMG पोंजी

मुझे नहीं पता तुम्हारा क्या मतलब है। मैंने कॉलम के लिए एक सशर्त लगाने की कोशिश की है, लेकिन यह काम नहीं करता है। यह एक चयनित स्टेटमेंट के लिए काम करता है, लेकिन अपडेट स्टेटमेंट के लिए नहीं। (select (केस (कंडीशन)) जब सच होता है तो myTable से कॉलमक्स और कॉलॉमी अंत) .... अपडेट काम नहीं करता है, और मैं देख सकता हूं क्यों। ' t उस काम को करने का एक तरीका लगता है।
pqsk

जवाबों:


188

आप अपनी क्वेरी की संरचना को बदलने के लिए एक शर्त का उपयोग नहीं कर सकते, बस इसमें शामिल डेटा। आप ऐसा कर सकते हैं:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

यह शब्दबद्ध रूप से समान है, लेकिन बस ध्यान रखें कि दोनों कॉलम हमेशा अपडेट रहेंगे । यह संभवतः आपको कोई समस्या नहीं देगा, लेकिन यदि आपके पास एक उच्च लेन-देन की मात्रा है, तो यह समसामयिक मुद्दों का कारण बन सकता है।

विशेष रूप से जो आप पूछ रहे हैं उसे करने का एकमात्र तरीका गतिशील SQL का उपयोग करना है। हालाँकि, यह कुछ ऐसा है जिससे मैं आपको दूर रहने के लिए प्रोत्साहित करूँगा। उपरोक्त समाधान लगभग निश्चित रूप से आपके लिए पर्याप्त होगा।


मैं गतिशील SQL के बारे में सहमत हूं। क्या मेरा डेटा हालांकि प्रभावित होगा? मेरा मतलब है कि मैं नहीं चाहता कि यह कुछ निश्चित स्थिति के लिए बदले। तो यह सिर्फ पुनर्बलन होगा कि वहां पहले से क्या है? डीबी को हिट की मात्रा इतनी बुरी नहीं हो सकती है।
pqsk

@pqsk: इससे आपके डेटा पर कोई असर नहीं पड़ना चाहिए, यह सिर्फ उसी चीज को फिर से स्थापित करना चाहिए जो पहले से ही है जो भी कॉलम प्रभावित होने वाला नहीं है
एडम रॉबिन्सन

धन्यवाद। मैं इसके साथ जाने वाला हूं। इतना सरल, एक गुफावासी भी कर सकता है। haha।
pqsk

1
@AdamRobinson को डेढ़ साल बीत चुके हैं क्या आपको केवल एक कॉलम अपडेट करने का कुछ और कारगर तरीका पता है

@Somebodyisintrouble: एक कॉलम को अपडेट करने का एकमात्र तरीका एक अलग क्वेरी का उपयोग करना है।
एडम रॉबिन्सन

23
UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

1
क्या आपने केवल एडम की प्रतिक्रिया की नकल की, या यह कहीं और से लिया गया था? haha। बस इतना ही देखा।
pqsk

1
@pqsk: हमारी प्रतिक्रियाओं थे ~ 1 मिनट के अलावा, इसलिए मैं मैं कल्पना करता बस क्लिक किया तेजी से एक छोटे से प्रस्तुत;)
एडम रॉबिन्सन

23
@pqsk: हाँ, मैंने अभी एडम की प्रतिक्रिया की नकल की, कुछ 23सेकंड पहले उन्होंने इसे पोस्ट किया। मैं एक तेजी से मुकाबला कर रहा हूँ!
क्वासोनि

2
@pqsk: यदि आप कर्सर को इसके ऊपर रखते हैं * min ago, तो यह आपको सटीक समय दिखाएगा कि यह पोस्ट किया गया था।
क्वासोनि

2
निष्पक्ष होना, भले ही दोनों एक ही हैं: यदि आपके बाद आदम का जन्म हुआ होगा, तो उन्होंने कुछ और विस्तार किया। इसलिए मैंने उनके जवाब के रूप में चिह्नित किया। हालांकि धन्यवाद।
pqsk

4

यहां छवि विवरण दर्ज करें

मैं अपने ContactNo को 8018070999 में बदलना या अपडेट करना चाहता हूँ जहाँ केस स्टेटमेंट का उपयोग करके 8018070777 है

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

यहां छवि विवरण दर्ज करें


1
इसके लिए इस क्वेरी का उपयोग क्यों न करें UPDATE [संपर्क] SET contactNo = 8018070999 WHERE contactNo = 8018070777
NewGuy


1

मुझे पता है कि यह एक बहुत पुराना सवाल है और समस्या के रूप में चिह्नित किया गया है। हालांकि, अगर कोई मेरा जैसा मामला है जहां तालिका में अपडेट घटनाओं पर डेटा लॉगिंग के लिए ट्रिगर है, तो यह समस्या पैदा करेगा। दोनों कॉलम को अपडेट मिलेगा और लॉग बेकार प्रविष्टियां करेगा। जिस तरह से मैंने किया

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

अब इसका एक और लाभ है कि यह उपरोक्त समाधानों की तरह तालिका पर अनावश्यक लेखन नहीं करता है।


यह एक अच्छा बिंदु और अच्छा विकल्प है! मैं अब मूल कोड पर काम नहीं कर रहा हूं जो इस धागे की ओर ले जाता है, लेकिन टी का हमेशा अलग समाधान होना अच्छा है और मुझे लगता है कि यह एक अच्छा समाधान है
pqsk 3:11

-1

मेरा मानना ​​है कि आप अन्य उत्तरों को निम्नानुसार समायोजित करके "गैर-वांछित" कॉलम को अपडेट कर सकते हैं:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

जैसा कि मैं इसे समझता हूं, यह केवल तभी अद्यतन करेगा जब शर्त पूरी हो जाएगी।

सभी टिप्पणियों को पढ़ने के बाद, यह सबसे कुशल है:
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

नमूना तालिका:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
नमूना डेटा:
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

अब मुझे लगता है कि आप एक शर्त लिख सकते हैं जो नल को संभालती है। मेरे उदाहरण के लिए, मैं मान रहा हूं कि आपने एक ऐसी शर्त लिखी है जो True, False या Null का मूल्यांकन करती है। अगर आपको इसकी मदद की जरूरत है, तो मुझे बताएं और मैं पूरी कोशिश करूंगा।

अब कोड की इन दो पंक्तियों को चलाने से X से 25 में परिवर्तन होता है यदि और केवल तभी ColConditional True (1) और Y से 25 यदि और केवल तभी ColConditional गलत (0) है

Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0

PS मूल प्रश्न या प्रश्न के किसी भी अपडेट में शून्य मामले का उल्लेख नहीं किया गया था, लेकिन जैसा कि आप देख सकते हैं, यह बहुत ही सरल उत्तर उन्हें वैसे भी संभालता है।


1
यह वास्तव में काम नहीं करता है। एक के लिए, यदि स्तंभ नल की अनुमति देता है, तो जब शर्त पूरी नहीं होती है, तो एक शून्य मान असाइन किया जाता है। मामले में जब नल की अनुमति नहीं है, तो अद्यतन विफल हो जाएगा। आपकी अंतिम "कुशल" क्वेरी अमान्य sql है, कम से कम TSQL में। क्या आपने एक विशिष्ट इंजन पर इसका परीक्षण किया था और इसने आपके लिए काम किया था?
pqsk 14

मैंने SQL Server 2005 पर इसका परीक्षण किया और यह पूरी तरह से दिखाया गया है। मैं यह जानना चाहूंगा कि यह क्यों डाउन किया गया था और एक उदाहरण NULL मूल्य को अपडेट करते हुए दिखा रहा है, क्योंकि ऊपर मेरे परीक्षण में, शून्य मान अपडेट नहीं किया गया है। मैंने हमेशा सोचा है कि सबसे सरल उत्तर सबसे अच्छा है और अगर मैं लाखों रिकॉर्ड के साथ एक डेटाबेस के साथ काम कर रहा हूं तो मुझे यकीन है कि अन-जरूरी पंक्तियों को अपडेट नहीं करना है।
जॉन ग्रीनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.