টি-এসকিউএল: একটি শর্তের উপর নির্ভর করে নির্দিষ্ট কলামগুলি আপডেট করার জন্য একটি আপডেটের স্টেটমেন্টে CASE ব্যবহার করা


108

আমি ভাবছি এটি আদৌ সম্ভব কিনা। শর্তটি সত্য হলে আমি কলাম কলাম আপডেট করতে চাই, অন্যথায় কলাম y আপডেট করা হবে

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

আমি সর্বত্র অনুসন্ধান করেছি, কিছু জিনিস চেষ্টা করে দেখেছি এবং এর সমাধান খুঁজে পাচ্ছি না। আমি মনে করি এটি সম্ভব নয়, তবে আমি ভেবেছিলাম আমি এখানে জিজ্ঞাসা করব এবং দেখুন যে কেউ এর আগে এটি করেছে কিনা। আগাম ধন্যবাদ.


হ্যাঁ, সবাইকে একই টেবিলে ধরে নিচ্ছি। নিজের জন্য দেখার জন্য আপনি সর্বদা এটিকে কোনও লেনদেনে চালাতে এবং ত্রুটিতে রোলব্যাক করতে পারেন।
ওএমজি পনিজ

আপনি কি বোঝাতে চাচ্ছেন তা আমি নিশ্চিত নই. আমি কলামটির জন্য শর্তযুক্ত রাখার চেষ্টা করেছি, তবে এটি কার্যকর হয় না। এটি সিলেক্ট স্টেটমেন্টের জন্য কাজ করে তবে কোনও আপডেট স্টেটমেন্টের জন্য নয়। (মাই টেবিল থেকে কলাম (অন্য কলামি শেষ হওয়ার পরে সত্য (কেস (কন্ডিশন)) সিলেক্ট করুন .... আপডেটটি কাজ করে না এবং আমি দেখতে পাচ্ছি কেন সেখানে নেই '। এই কাজটি করার কোনও উপায় মনে হচ্ছে না
pqsk

উত্তর:


188

আপনি আপনার ক্যোয়ারির কাঠামো পরিবর্তন করতে কোনও শর্ত ব্যবহার করতে পারবেন না, কেবলমাত্র জড়িত ডেটা। আপনি এটি করতে পারেন:

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

এটি শব্দার্থগতভাবে একই, তবে কেবল মনে রাখবেন যে উভয় কলামই সর্বদা আপডেট হবে । এটি সম্ভবত আপনার কোনও সমস্যা তৈরি করবে না, তবে আপনার যদি লেনদেনের পরিমাণ বেশি থাকে তবে এটি সম্মতিযুক্ত সমস্যার কারণ হতে পারে।

আপনি যা জিজ্ঞাসা করছেন তা করার একমাত্র উপায় হ'ল ডায়নামিক এসকিউএল ব্যবহার করা। এটি অবশ্য এমন কিছু যা আমি আপনাকে দূরে থাকতে উত্সাহিত করি। উপরের সমাধানটি আপনার পরে কী হবে তা অবশ্যই যথেষ্ট হবে।


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

@ পিকিউএসকিউ: এটি আপনার ডেটাগুলিকে প্রভাবিত করবে না, যে কোনও কলাম প্রভাবিত হওয়ার কথা না বলে এটি ইতিমধ্যে সেখানে উপস্থিত করা উচিত rein
অ্যাডাম রবিনসন

ধন্যবাদ। আমি এই সাথে যেতে যাচ্ছি। এত সহজ, এমনকি একজন গুহ্যমান ব্যক্তিও এটি করতে পারে। হা হা।
pqsk

1
@ অ্যাডামরবিনসন 1.5 বছর কেটে গেছেন আপনি কি কেবল একটি কলাম আপডেট করার আরও কিছু কার্যকরী উপায় জানেন

@ সোমোডিআইসিনট্রাবল: একটি কলাম আপডেট করার একমাত্র উপায় হ'ল আলাদা ক্যোয়ারী ব্যবহার করা।
অ্যাডাম রবিনসন

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

1
আপনি কি আদমের প্রতিক্রিয়াটি কেবল অনুলিপি করেছেন, বা এটি অন্য কোথাও থেকে নেওয়া হয়েছে? হা হা। সবেমাত্র সেদিকে খেয়াল আছে।
pqsk

1
@ পিকিউএসকিউ: আমাদের প্রতিক্রিয়াগুলি এক মিনিটের ব্যবধানে ছিল, তাই আমি কল্পনা করেছিলাম যে আমি কিছুটা দ্রুত জমা দেওয়ার জন্য ক্লিক করেছি;)
অ্যাডাম রবিনসন

23
@ পিকিউএসকি: হ্যাঁ, আমি অ্যাডামের প্রতিক্রিয়াটি 23পোস্ট করার কয়েক সেকেন্ড আগেই এটি অনুলিপি করেছি। আমি একজন দ্রুত কপিপাস্টার!
কাসনসুই

2
@ পিকিউএসকিউ: আপনি যদি কার্সারটির উপরে রাখেন তবে * min agoএটি আপনাকে পোস্ট করার ঠিক সময়টি দেখাবে।
কাসনসুই

2
উভয়টি একই হলেও ন্যায্য, আদম যদি আপনার পরে বের হয়ে আসত তবে তিনি আরও কিছুটা ব্যাখ্যা করেছিলেন। সে কারণেই আমি তাকে উত্তর হিসাবে চিহ্নিত করেছি। ধন্যবাদ যদিও.
pqsk

4

এখানে চিত্র বর্ণনা লিখুন

আমি আমার পরিচিতি নম্বরটি 8018070999 এ পরিবর্তন করতে বা আপডেট করতে চাই যেখানে কেস স্টেটমেন্ট ব্যবহার করে 8018070777 রয়েছে

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

এখানে চিত্র বর্ণনা লিখুন


1
এজন্য কেন এই কোয়েরিটি ব্যবহার করবেন না আপডেট করুন [পরিচিতিগুলি] যোগাযোগ করুন নম্বর = 8018070999 কোথায় যোগাযোগ করুন না = 8018070777
নিউগুই


1

আমি জানি এটি একটি খুব পুরানো প্রশ্ন এবং সমস্যাটি স্থির হিসাবে চিহ্নিত করা হয়েছে। তবে, আমার মতো কেসের সাথে যদি কেউ টেবিলের আপডেট ইভেন্টগুলিতে ডেটা লগিংয়ের জন্য ট্রিগার থাকে তবে এটি সমস্যা তৈরি করবে। উভয় কলামই আপডেট পাবে এবং লগ অকেজো এন্ট্রি করবে। আমি যেভাবে করেছি

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

এখন এটির আরও একটি সুবিধা রয়েছে যে এটির উপরের সমাধানগুলির মতো টেবিলে অপ্রয়োজনীয় লেখাগুলি নেই।


এটি একটি ভাল পয়েন্ট এবং ভাল বিকল্প! আমি আর এই মূল কোডটি কাজ করছি না যা এই থ্রেডের দিকে পরিচালিত করে, তবে বিভিন্ন সমাধানের পক্ষে সবসময়ই ভাল এবং আমি মনে করি এটি একটি ভাল সমাধান
pqsk

-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)

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

এখন এই দুটি রেখার কোডটি চালিয়ে যাওয়া X এবং 25 তে পরিবর্তিত হবে এবং কেবলমাত্র যদি ColConditional সত্য (1) এবং Y থেকে 25 হয় এবং কেবলমাত্র ColConditional মিথ্যা (0) হলে

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

পিএস নাল কেসটি কখনই মূল প্রশ্নে বা প্রশ্নের কোনও আপডেটে উল্লেখ করা হয়নি, তবে আপনি দেখতে পাচ্ছেন, এই খুব সাধারণ উত্তর যাইহোক তাদের পরিচালনা করে।


1
এটি আসলে কাজ করে না। একটির জন্য, যদি কলামটি নালকে অনুমতি দেয়, তবে যখন শর্তটি পূরণ হয় না তখন নাল মান নির্ধারিত হয়। ক্ষেত্রে যখন নালগুলির অনুমতি নেই তবে আপডেটটি ব্যর্থ হবে। আপনার চূড়ান্ত "দক্ষ" ক্যোয়ারীটি কমপক্ষে টিএসকিউএলে অবৈধ স্ক্যাকেল। আপনি কি এটি একটি নির্দিষ্ট ইঞ্জিনে পরীক্ষা করেছেন এবং এটি আপনার পক্ষে কাজ করেছে?
pqsk

আমি এসকিউএল সার্ভার 2005 এ এটি পরীক্ষা করেছি এবং এটি প্রদর্শিত হিসাবে পুরোপুরি কাজ করে। আমি নিশ্চিতভাবে জানতে চাই কেন এটি কেন ভোট হয়েছে এবং একটি উদাহরণ যা NUL এর মান আপডেট হচ্ছে তা দেখায়, কারণ উপরের আমার পরীক্ষায় নাল মানটি আপডেট হয় না। আমি সর্বদা ভেবেছি যে সহজ উত্তরটি সবচেয়ে ভাল এবং আমি যদি লক্ষ লক্ষ রেকর্ড সহ একটি ডাটাবেস নিয়ে কাজ করি তবে আমি নিশ্চিত যে অপরিহার্য সারিগুলি আপডেট করতে চাই না।
জন গ্রেইনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.