UPDATE ক্যোয়ারিতে কলামগুলি নির্বাচন করতে CASE ব্যবহার করবেন?


13

কোয়েরিতে (পোস্টগ্রিস) CASEকোন কলামগুলি প্রদর্শিত হবে তা বেছে নিতে আমি ব্যবহার করতে পারি SELECT:

SELECT CASE WHEN val = 0 THEN column_x
            WHEN val = 1 THEN column_y
            ELSE 0
       END AS update, ...

UPDATEপোস্টগ্র্রেসে কোনও ক্যোয়ারী করার সময় কি কি একইরকম সম্ভব আছে (উদাহরণস্বরূপ কোন কলামগুলি আপডেট করা উচিত তা বেছে নিন)? আমি ধরে নিই যেহেতু আমি এ সম্পর্কে কিছুই খুঁজে পাই না, তবে কারও কাছে একটি চতুর বিকল্প রয়েছে ( CASEকলামের মান নতুন মান নির্ধারণ করা উচিত বা কেবল বিদ্যমানটিকে পুনরায় সাইন করা উচিত কিনা তা নির্ধারণের জন্য একটি পদ্ধতি ব্যবহার করে বা প্রতিটি কলাম আপডেট করে) মান)। যদি কোনও সহজ বিকল্প না থাকে তবে আমি অবশ্যই এটির উত্তর হিসাবে গ্রহণ করব।

অতিরিক্ত তথ্য : আমার ক্ষেত্রে আমার 14 টি সম্ভাব্য কলাম রয়েছে যা আপডেট হতে পারে, প্রতি ম্যাচের সারি অনুসারে কেবলমাত্র একটি আপডেট করা হবে (আপডেট হওয়া টেবিলটি ক্যোয়ারির সাথে অন্যটির সাথে যোগ হয়েছে)। সারিগুলির আপডেট করার পরিমাণ সম্ভবত পরিবর্তিত হবে, কয়েক ডজন বা কয়েকশ হতে পারে। আমি বিশ্বাস করি যোগদানের শর্তগুলির জন্য সূচকগুলি যথাযথ।

উত্তর:


26

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

UPDATE some_table
SET    column_x = CASE WHEN should_update_x THEN new_value_for_x ELSE column_x END
     , column_y = CASE WHEN should_update_y THEN new_value_for_y ELSE column_y END
     , column_z = CASE WHEN should_update_z THEN new_value_for_z ELSE column_z END
FROM   ...

সুতরাং শর্তাদি যদি কোনও নির্দিষ্ট কলামে আপডেটের জন্য সঠিক না হয় তবে আপনি কেবল তার বর্তমান মান ফিরিয়ে দিন।

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


সমস্ত কিছু আপডেট হওয়ার বিষয়ে পরামর্শ দেওয়ার জন্য ধন্যবাদ, যদি এটি ধীর হয় তবে আমি @ কলিনের হার্টের একাধিক আপডেট বিবৃতি পেতে পরামর্শ নিতে পারি।
newenglander

আপনি যে সমস্যাটি সম্পূর্ণ করেছেন তা নিশ্চিত করে আপনার ও ও যেখানে শৃঙ্খলাগুলি সমস্ত সারিগুলিকে ফিল্টার করে যেখানে কোনও পরিবর্তন প্রয়োজন নেই, তা হ্রাস করতে পারেন, তবে এর অর্থ এসইটি ধারা এবং পুরো ধারা উভয়ই আপনার সমস্ত শর্ত পুনরাবৃত্তি করতে পারে (যদি না সরল সামগ্রিক চেক না হয় তবে) সংযুক্ত সমস্ত শর্তের 100% সমতুল্য)। এই মুহুর্তে এই পদ্ধতিটি আরও কার্যকর হতে পারে তবে একাধিক আপডেট পদ্ধতি বজায় রাখা সহজ হতে পারে।
ডেভিড স্পিলিট

এও সচেতন থাকুন যে একই কলামে কলাম আপডেট করা পুনরায় তৈরির কারণ ঘটবে
কলিন 'হার্ট

@ কলিন: হ্যাঁ, যে কোনও আপডেট ডিবি'র লেনদেনের লগের মধ্য দিয়ে যাবে এমন আপডেটগুলিও যা পূর্বের মত মানগুলি রাখার ক্ষেত্রে ক্ষেত্রগুলি আপডেট করার কারণে নোপস হয়। তাত্ক্ষণিক পারফরম্যান্স ইস্যু হওয়ার সম্ভাবনার পাশাপাশি প্রতিলিপি, ডিফারেনশিয়াল ব্যাকআপ, লগ শিপিং ইত্যাদি ব্যবহার করা যদি এটি গুরুত্বপূর্ণ কারণ হতে পারে তবে অতিরিক্ত সারি আপডেট ক্রিয়াকলাপগুলি তাদের প্রয়োজনীয় স্থান / ব্যান্ডউইথকে বাড়িয়ে তুলবে।
ডেভিড স্পিললেট

টিপসটির জন্য উভয়কে ধন্যবাদ, আমার ক্ষেত্রে একক আপডেটের বিবৃতিটি ভাল কাজ করেছে।
newenglander

5

আপনার কাছে কলামের কতগুলি বিভিন্ন সংমিশ্রণ আপডেট হবে? পুরো টেবিলের কত সারি আপডেট করা হবে? সারিগুলিতে আপডেটের জন্য দ্রুত অ্যাক্সেসের জন্য সূচকগুলি স্থানে রয়েছে?

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

সেট-বেসড চেষ্টা করুন এবং ভাবেন, ধরে নিবেন না যে আপডেটটিকে প্রাথমিক কী দ্বারা পাওয়া একটি একক সারি আপডেট করা দরকার।


উত্তর করার জন্য ধন্যবাদ. আমি আমার প্রশ্নের সাথে আরও কিছু তথ্য যুক্ত করেছি, আশা করি এটি বোধগম্য। একাধিক আপডেটের বিবৃতি সহ এটি একটি ভাল বিকল্প (আমি একটি আপডেটের বিবৃতি পছন্দ করি তবে আমি দেখতে পাচ্ছি সেখানে একটি সুবিধা রয়েছে)।
newenglander

আমি যে উত্তরটি খুঁজছি এটি এই হতে পারে তবে আপনি কি বোঝাতে চেয়েছেন যে আপডেট কলাম_এক্স = নতুন_মূল্য_ফর্ম_এক্স যেখানে @val = 0. আমি এরকম কিছুতে পরীক্ষা করতে পারি। মজার লাগছে। ভাল = 0 আপডেট করুন কলাম_এক্স = নতুন_মূল্য_র_এক্স ইত্যাদি শুরু করা সহজ নয়
ক্যাশকো

-1
update Practicing  -- table you will be updating
 set email = case -- column you will be updating
    when FName = 'Glenn' then 'Ace@Assasin.com'
       when FName = 'Riddick' then 'fallguy@Drunk.com'
       when FName = 'Jeffrey' then 'sorcerer@wizcom'
       else email
    end

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