PostgreSQL ব্যবহার করে একই ক্যোয়ারিতে একাধিক সারি আপডেট করুন


191

আমি এক বিবৃতিতে PostgreSQL এ একাধিক সারি আপডেট করতে চাইছি। নিম্নলিখিত মত কিছু করার উপায় আছে?

UPDATE table 
SET 
 column_a = 1 where column_b = '123',
 column_a = 2 where column_b = '345'

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

দুঃখিত আমার ভুল. আপডেট করা হয়েছে।
শূন্য323

উত্তর:


424

আপনি update ... fromসিনট্যাক্স এবং ম্যাপিং টেবিলটি ব্যবহার করতে পারেন । আপনি যদি একাধিক কলাম আপডেট করতে চান তবে এটি আরও সাধারণীকরণযোগ্য:

update test as t set
    column_a = c.column_a
from (values
    ('123', 1),
    ('345', 2)  
) as c(column_b, column_a) 
where c.column_b = t.column_b;

আপনি নিজের পছন্দমতো কলাম যুক্ত করতে পারেন:

update test as t set
    column_a = c.column_a,
    column_c = c.column_c
from (values
    ('123', 1, '---'),
    ('345', 2, '+++')  
) as c(column_b, column_a, column_c) 
where c.column_b = t.column_b;

sql fiddle demo


10
এছাড়াও, একটি সঠিক তথ্য প্রকার নির্দিষ্ট করতে হতে পারে। একটি তারিখের সাথে একটি উদাহরণ: পোস্টগ্র্রেএসকিউএল ডকুমেন্টেশনে... from (values ('2014-07-21'::timestamp, 1), ('2014-07-20', 2), ... আরও বিশদ
জোসে আন্দিয়াস

দুর্দান্ত কাজ করে, স্পষ্ট করার জন্য আপনাকে ধন্যবাদ! এর জন্য পোস্টগ্রিজ ডকুমেন্টেশন কিছুটা বিভ্রান্তিকর পড়ার জন্য তৈরি করে।
skwidbreth

52

@ রোমানের সমাধানের ভিত্তিতে, আপনি একাধিক মান সেট করতে পারেন:

update users as u set -- postgres FTW
  email = u2.email,
  first_name = u2.first_name,
  last_name = u2.last_name
from (values
  (1, 'hollis@weimann.biz', 'Hollis', 'O\'Connell'),
  (2, 'robert@duncan.info', 'Robert', 'Duncan')
) as u2(id, email, first_name, last_name)
where u2.id = u.id;

4
এটি তার সমাধানের মতো বলে মনে হচ্ছে .. আপডেট করুন আপডেট থেকে (ভ্যালু ...) যেখানে। কীভাবে এটি কেবল ভিত্তিক?
ইভান ক্যারল

14
আমি এই উত্তরটিকে পছন্দ করি কারণ পরিবর্তনশীল নামগুলি কী চলছে তা বোঝা সহজ করে তোলে।
জন লেমন

কি দারুন. যথাযথ এবং পরিষ্কার। আমি GoLang এ এরকম কিছু বাস্তবায়নের চেষ্টা করছি। সুতরাং আমি মানগুলির জন্য স্থানে একটি অ্যারে পাস করতে পারি? এরকম কিছু, from (values $1)যেখানে $ 1 স্ট্রাক্টগুলির একটি অ্যারে। উপরের ক্ষেত্রে, কঠোরটির আইডি, প্রথম নাম এবং সর্বশেষ নাম বৈশিষ্ট্য হিসাবে থাকবে।
রেশমা সুরেশ

26

হ্যা, তুমি পারো:

UPDATE foobar SET column_a = CASE
   WHEN column_b = '123' THEN 1
   WHEN column_b = '345' THEN 2
END
WHERE column_b IN ('123','345')

এবং কাজের প্রমাণ: http://sqlfiddle.com/#!2/97c7ea/1


8
এই ভুল ... আপনি সব সারি আপডেট হবে, যদিও তা নয় '123'কিংবা '345'। আপনার ব্যবহার করা উচিত WHERE column_b IN ('123','456')...
ম্যাথিউস ওল

1
আমার মনে '456'হয়'345'
রোমান পেকার

2
আপনি যদি ELSE column_bশেষ WHEN ? THEN ?লাইনের পরে যুক্ত করেন তবে কলামটি এটির বর্তমান মানতে সেট করা হবে, এইভাবে ম্যাথিউসকিউআই যা বলেছিল তা আটকাবে।
কেভিন অরিস

1
এটি তিনি যা চেয়েছিলেন তা নয় .. তাকে একাধিক কল আপডেট করতে হবে, কর্নেল
বিয়ের

এটি কি ঠিক ওপি যা চেয়েছিল তা নয় - কেবলমাত্র কলাম_এই আপডেট করতে হবে (কলাম_বি এর মানের ভিত্তিতে), একাধিক কলাম নয়, তাই না?
কেভ্যালার

3

অনুরূপ দৃশ্য জুড়ে এসেছিল এবং CASE এক্সপ্রেশনটি আমার পক্ষে কার্যকর useful

UPDATE reports SET is_default = 
case 
 when report_id = 123 then true
 when report_id != 123 then false
end
WHERE account_id = 321;

প্রতিবেদনগুলি - এখানে একটি সারণী, উপরে উল্লিখিত রিপোর্ট_আইডগুলির জন্য অ্যাকাউন্ট_আইডি সমান। উপরের ক্যোয়ারীটি 1 টি রেকর্ড (যা শর্তের সাথে একের সাথে মেলে) সেট করে সত্য এবং সমস্ত মিল না খাতাকে মিথ্যে বলে।


2

একক ক্যোয়ারিতে একাধিক সারি আপডেট করার জন্য , আপনি এটি ব্যবহার করে দেখতে পারেন

UPDATE table_name
SET 
column_1 = CASE WHEN any_column = value and any_column = value THEN column_1_value end,
column_2 = CASE WHEN any_column = value and any_column = value THEN column_2_value end,
column_3 = CASE WHEN any_column = value and any_column = value THEN column_3_value end,
.
.
.
column_n = CASE WHEN any_column = value and any_column = value THEN column_n_value end

আপনার যদি অতিরিক্ত শর্তের প্রয়োজন না হয় তবে andএই কোয়েরির অংশটি সরিয়ে দিন


0

ধরা যাক আপনার আইডির একটি অ্যারে এবং স্ট্যাটাসের সমতুল্য অ্যারে রয়েছে - এখানে স্থির এসকিউএল (বিভিন্ন মানের কারণে পরিবর্তিত হয় না এমন স্কয়ার কোয়েরি) দিয়ে এটি কীভাবে করা যায় তা একটি উদাহরণ:

drop table if exists results_dummy;
create table results_dummy (id int, status text, created_at timestamp default now(), updated_at timestamp default now());
-- populate table with dummy rows
insert into results_dummy
(id, status)
select unnest(array[1,2,3,4,5]::int[]) as id, unnest(array['a','b','c','d','e']::text[]) as status;

select * from results_dummy;

-- THE update of multiple rows with/by different values
update results_dummy as rd
set    status=new.status, updated_at=now()
from (select unnest(array[1,2,5]::int[]) as id,unnest(array['a`','b`','e`']::text[]) as status) as new
where rd.id=new.id;

select * from results_dummy;

-- in code using **IDs** as first bind variable and **statuses** as the second bind variable:
update results_dummy as rd
set    status=new.status, updated_at=now()
from (select unnest(:1::int[]) as id,unnest(:2::text[]) as status) as new
where rd.id=new.id;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.