একটি আপডেট স্টেটমেন্ট সহ কলামে মান পরিবর্তন করা


12

আপনি দেখতে পেয়েছেন যে একটি সিস্টেমে একটি ত্রুটি ভুলভাবে পুরুষদের (এম) নামকরণ করেছে মহিলাদের (ডাব্লু) এবং এর বিপরীতে ডাটাবেসে। কলামগুলি কেবল একটি চরিত্রের জন্য অনুমতি দেয়। কোনও টেম্প টেবিল ব্যবহার না করে এটি সমাধানের জন্য একটি আপডেট কোয়েরি লিখুন।

আমার সাম্প্রতিক একটি সাক্ষাত্কারে এই প্রশ্নটি জিজ্ঞাসা করা হয়েছিল, এবং আমি আরও সাক্ষাত্কারে যাচ্ছি যাতে একই ধরণের প্রশ্ন থাকতে পারে তাই আমি কীভাবে এটি পরিচালনা করব সে সম্পর্কে একটি ধারণা পেতে চাই।


6
আপনি কি একটি নির্দিষ্ট ডাটাবেস পণ্য ধরে নিতে বলা হয়েছিল? যেমন মাইএসকিউএল, এসকিউএল সার্ভার, ওরাকল, পোস্টগ্রিজ এসকিউএল ...?
পল হোয়াইট 9

আপনার সিস্টেমটি কি নতুন সম্প্রদায়ের নির্দেশিকাগুলি পড়েছে? : \
এইআর

উত্তর:


23

আপনি CASEকিছু ধরণের অভিব্যক্তি ব্যবহার করতে চান want

এসকিউএল সার্ভারে কোডটি দেখতে এমন হবে:

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

সম্পাদনা: মন্তব্যগুলিতে যেমন বলা হয়েছে (এবং অন্যান্য উত্তরগুলির মধ্যে) 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 (বা অন্যান্য সম্ভাব্য লিঙ্গ) কে 'এম' হিসাবে প্রতিস্থাপন করবে যা ভুল হবে।


অন্য কয়েকটি বিকল্প হতে পারে

/*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()এবং এটি মাইএসকিউএল এ কাজ করবে;)
ypercubeᵀᴹ

9

ওরাকলে আপনি অন্য উত্তরগুলির মতো একটি CASE ব্যবহার করতে পারেন:

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

আপনি একটি ডিকোডও ব্যবহার করতে পারেন:

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বা `-` ফলাফলে উপস্থিত হওয়া।
মার্টিন স্মিথ

@ মার্টিনস্মিথ: খুব ভালো কথা। যদি সেগুলি না হয় তবে আমাদের ASCII(Gender)সাথে প্রতিস্থাপন করতে হবে ASCII(UPPER(Gender)), যা কম মার্জিত, যদিও খুব বেশি নয়।
অ্যান্ড্রি এম

@ মার্টিনস্মিথ যদি ছোট আকারের এম এবং ডাব্লু থাকে তবে সেগুলি কি এই WHEREধারা দ্বারা প্রত্যাখাত হবে না ?
ypercubeᵀᴹ

1
@ ইপারসিলিকিউবে - কেবলমাত্র সংবেদনশীল জোটের ক্ষেত্রে (যা সাধারণ আইএমই নয়)
মার্টিন স্মিথ

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

আপনি যে ফলাফল পাবেন তা যাচাই করার জন্য। রোলব্যাকের মাধ্যমে লেনদেন সম্পাদন করা এবং যখন আপনার ফলাফলগুলি প্রত্যাশার সাথে মিলিত হয় তখন এটি একটি কমিটে স্যুইচ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.