एक अद्यतन विवरण के साथ एक कॉलम में मान स्विच करना


12

आप पाते हैं कि सिस्टम में त्रुटि ने गलत तरीके से पुरुषों (M) को महिलाओं (W) और डेटाबेस में इसके विपरीत नाम दिया है। कॉलम केवल एक वर्ण के लिए अनुमति देता है। किसी भी अस्थायी तालिकाओं का उपयोग किए बिना, इसे हल करने के लिए एक अद्यतन क्वेरी लिखें।

यह प्रश्न मैंने हाल ही में एक साक्षात्कार में पूछा था, और मैं और अधिक साक्षात्कारों में जा रहा हूं जिनमें समान प्रश्न हो सकते हैं इसलिए मैं यह जानना चाहता था कि इसे कैसे संभालना है।


6
क्या आपने किसी विशेष डेटाबेस उत्पाद को मानने के लिए कहा था? जैसे MySQL, SQL Server, Oracle, PostgreSQL ...?
पॉल व्हाइट 9

क्या आपके सिस्टम ने नए सामुदायिक दिशानिर्देश पढ़े हैं? : \
AER

जवाबों:


23

आप CASEकिसी प्रकार की अभिव्यक्ति का उपयोग करना चाहते हैं ।

SQL सर्वर में कोड इस तरह दिखेगा:

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M'
                  ELSE gender END

संपादित करें: जैसा कि टिप्पणियों में कहा गया है (और कुछ अन्य उत्तरों में) यदि आप कथन पर WHERE क्लॉज लगाते हैं तो ELSE आवश्यक नहीं है।

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M' END
WHERE gender IN ('M','W')

इससे अनावश्यक अपडेट से बचा जाता है। या तो मामले में महत्वपूर्ण बात यह याद रखना है कि एम एंड डब्ल्यू (उदाहरण के लिए NULL) के अलावा अन्य विकल्प भी हैं और आप गलत जानकारी नहीं डालना चाहते हैं। उदाहरण के लिए:

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  ELSE 'M' END

यह किसी भी NULL (या अन्य संभावित लिंग) को 'M' के रूप में प्रतिस्थापित करेगा जो गलत होगा।


कुछ अन्य विकल्प होंगे

/*Simple form of CASE rather than Searched form*/
UPDATE TableName
SET    gender = CASE gender
                  WHEN 'M' THEN 'W'
                  WHEN 'W' THEN 'M'
                END
WHERE  gender IN ( 'M', 'W' );

और एक अधिक संक्षिप्त

/*For SQL Server 2012+*/
UPDATE TableName
SET    gender = IIF(gender = 'M', 'W', 'M')
WHERE  gender IN ( 'M', 'W' ); 

1
आप इसके IIF()साथ बदल सकते हैं IF()और यह MySQL में काम करेगा;)
ypercube

9

ओरेकल में आप एक CASE का उपयोग कर सकते हैं जैसे अन्य उत्तर हैं:

UPDATE TableName
SET gender = CASE WHEN gender = 'M' THEN 'W' 
                  WHEN gender = 'W' THEN 'M'
             END
WHERE gender in ('M','W');

आप एक DECODE का उपयोग भी कर सकते हैं:

UPDATE TableName SET gender = DECODE(gender,'M','W','W','M')
WHERE gender in ('M','W');

5

केवल दो मानों के बीच स्विच करने के लिए, आप इस ट्रिक को भी आजमा सकते हैं, जो एक CASEअभिव्यक्ति का उपयोग नहीं करता है (यहां ट्रांसेक्ट-एसक्यूएल मानकर):

UPDATE
  YourTable
SET
  Gender = CHAR(ASCII('M') + ASCII('W') - ASCII(Gender))
WHERE
  Gender IN ('M', 'W')
;

के वर्तमान मूल्य के आधार पर Gender, या ASCII(Gender)तो रद्द कर देगा ASCII('M')या ASCII('W'), अन्य कोड को CHAR()फ़ंक्शन द्वारा वापस इसी चरित्र में परिवर्तित करने के लिए छोड़ देगा ।

मैं इसे केवल तुलना के लिए छोड़ रहा हूं, हालांकि। हालांकि इस विकल्प में लालित्य का दिखावा हो सकता है, CASEअभिव्यक्ति का उपयोग करने वाला समाधान यकीनन अधिक पठनीय होगा और इस प्रकार इसे बनाए रखना आसान होगा, और यह निश्चित रूप से दो से अधिक मूल्यों तक विस्तार करना आसान होगा।


2
के सभी आशा करते हैं Mऔर Wअप्रत्याशित से बचने के लिए ऊपरी मामले में दर्ज किए गए थे 7या `-` परिणामों में दिखाई देने।
मार्टिन स्मिथ

@MartinSmith: बहुत अच्छी बात। यदि वे नहीं थे, तो हमें ASCII(Gender)साथ रखना होगा ASCII(UPPER(Gender)), जो कम सुरुचिपूर्ण है, हालांकि ज्यादा नहीं।
एंड्री एम

@MartinSmith अगर लोअर m और w के केस हैं, तो क्या वे WHEREक्लॉज द्वारा खारिज नहीं किए जाएंगे ?
ypercube y

1
@ YperSillyCubeᵀᴹ - केवल मामले में संवेदनशील टकराव (जो कि आम तौर पर IME नहीं हैं)
मार्टिन स्मिथ

4

आप इसे एक case ... whenअभिव्यक्ति के साथ कर सकते हैं :

mysql> select * from genderswap;
+--------+
| gender |
+--------+
| F      |
| F      |
| M      |
| M      |
| M      |
| M      |
| M      |
+--------+
7 rows in set (0.00 sec)

mysql> 
mysql> UPDATE genderswap SET gender = case 
    ->                                when gender='M' then 'F' 
    ->                                when gender='F' then 'M'
    ->                                end
    -> WHERE gender IN ('M', 'F');
Query OK, 7 rows affected (0.00 sec)
Rows matched: 7  Changed: 7  Warnings: 0

mysql> 
mysql> select * from genderswap;
+--------+
| gender |
+--------+
| M      |
| M      |
| F      |
| F      |
| F      |
| F      |
| F      |
+--------+
7 rows in set (0.00 sec)

mysql> 

2

मैं एक caseअभिव्यक्ति के साथ एक अद्यतन का उपयोग करेगा ।

DECLARE @Test TABLE
    (
      Name VARCHAR(100) NULL
    , Gender CHAR(1) NULL
    );

INSERT  INTO @Test
        ( Name, Gender )
VALUES  ( 'Jonathan', 'W' )
         ,
        ( 'Kelly', 'M' );

SELECT  Name
      , Gender
FROM    @Test;

UPDATE  @Test
SET     Gender = CASE WHEN Gender = 'M' THEN 'W'
                      ELSE 'M'
                 END;

SELECT  Name
      , Gender
FROM    @Test;

-1

आप एक caseअभिव्यक्ति का उपयोग करके इस अपडेट को कर सकते हैं ।

UPDATE names_table
   SET names_table.gender = ( CASE
                                  WHEN names_table.gender = 'M'
                                    THEN 'W'
                                  ELSE
                                      names_table.gender = 'M'
                              END)

मेरा सुझाव है कि लेन-देन के भीतर अपना अपडेट स्टेटमेंट चलाएं और एक साधारण क्वेरी जोड़ें जैसे:

SELECT n.gender, *
FROM names_table

आपको मिलने वाले परिणामों की जांच करने के लिए। रोलबैक के साथ लेन-देन निष्पादित करना और जब आपका परिणाम उम्मीद कर रहे हों तो आपके परिणाम के साथ इसे कमिट पर स्विच करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.