আমি এক বিবৃতিতে PostgreSQL এ একাধিক সারি আপডেট করতে চাইছি। নিম্নলিখিত মত কিছু করার উপায় আছে?
UPDATE table
SET
column_a = 1 where column_b = '123',
column_a = 2 where column_b = '345'
আমি এক বিবৃতিতে PostgreSQL এ একাধিক সারি আপডেট করতে চাইছি। নিম্নলিখিত মত কিছু করার উপায় আছে?
UPDATE table
SET
column_a = 1 where column_b = '123',
column_a = 2 where column_b = '345'
উত্তর:
আপনি 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;
... from (values ('2014-07-21'::timestamp, 1), ('2014-07-20', 2), ...
আরও বিশদ
@ রোমানের সমাধানের ভিত্তিতে, আপনি একাধিক মান সেট করতে পারেন:
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;
from (values $1)
যেখানে $ 1 স্ট্রাক্টগুলির একটি অ্যারে। উপরের ক্ষেত্রে, কঠোরটির আইডি, প্রথম নাম এবং সর্বশেষ নাম বৈশিষ্ট্য হিসাবে থাকবে।
হ্যা, তুমি পারো:
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
'123'
কিংবা '345'
। আপনার ব্যবহার করা উচিত WHERE column_b IN ('123','456')
...
'456'
হয়'345'
ELSE column_b
শেষ WHEN ? THEN ?
লাইনের পরে যুক্ত করেন তবে কলামটি এটির বর্তমান মানতে সেট করা হবে, এইভাবে ম্যাথিউসকিউআই যা বলেছিল তা আটকাবে।
অনুরূপ দৃশ্য জুড়ে এসেছিল এবং 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 টি রেকর্ড (যা শর্তের সাথে একের সাথে মেলে) সেট করে সত্য এবং সমস্ত মিল না খাতাকে মিথ্যে বলে।
একক ক্যোয়ারিতে একাধিক সারি আপডেট করার জন্য , আপনি এটি ব্যবহার করে দেখতে পারেন
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
এই কোয়েরির অংশটি সরিয়ে দিন
ধরা যাক আপনার আইডির একটি অ্যারে এবং স্ট্যাটাসের সমতুল্য অ্যারে রয়েছে - এখানে স্থির এসকিউএল (বিভিন্ন মানের কারণে পরিবর্তিত হয় না এমন স্কয়ার কোয়েরি) দিয়ে এটি কীভাবে করা যায় তা একটি উদাহরণ:
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;