[SQL] PostgreSQL의를 사용하여 동일한 쿼리에서 여러 행을 업데이트
SQLPostgreSQL의를 사용하여 동일한 쿼리에서 여러 행을 업데이트
나는 한 성명에서 PostgreSQL의 여러 행을 업데이트 할 찾고 있어요. 다음과 같은 것을 할 수있는 방법이 있나요?
UPDATE table
SET
column_a = 1 where column_b = '123',
column_a = 2 where column_b = '345'
해결법
-
==============================
1.또한 구문에서 ... 업데이트를 사용하고 매핑 테이블을 사용할 수 있습니다. 하나 이상의 열을 업데이트 할 경우 훨씬 더 일반화이다 :
또한 구문에서 ... 업데이트를 사용하고 매핑 테이블을 사용할 수 있습니다. 하나 이상의 열을 업데이트 할 경우 훨씬 더 일반화이다 :
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 바이올린 데모
-
==============================
2.@Roman의 솔루션을 기반으로 여러 값을 설정할 수 있습니다 :
@Roman의 솔루션을 기반으로 여러 값을 설정할 수 있습니다 :
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;
-
==============================
3.그래 넌 할수있어:
그래 넌 할수있어:
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
-
==============================
4.하나의 쿼리에서 여러 행을 업데이트하는 경우, 당신이 시도 할 수 있습니다
하나의 쿼리에서 여러 행을 업데이트하는 경우, 당신이 시도 할 수 있습니다
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
추가 조건이 필요하지 않은 경우 다음 제거하고이 쿼리의 일부
-
==============================
5.비슷한 시나리오를 가로 질러 와서 CASE 표현식은 나에게 유용했다.
비슷한 시나리오를 가로 질러 와서 CASE 표현식은 나에게 유용했다.
UPDATE reports SET is_default = case when report_id = 123 then true when report_id != 123 then false end WHERE account_id = 321;
보고서 - 여기에 테이블, ACCOUNT_ID는 위에서 언급 한 report_ids에 대한 동일합니다. 위의 쿼리는 1 개 기록 true로합니다 (조건에 일치 한) 모든 거짓에 일치하지 않는 사람을 설정합니다.
-
==============================
6.하자 당신이 ID와 상태의 해당하는 배열의 배열을 말한다 - 여기에 배열의 정적의 SQL (때문에 다른 값으로 변경하지 않는 SQL 쿼리)이 작업을 수행하는 방법을 예입니다 :
하자 당신이 ID와 상태의 해당하는 배열의 배열을 말한다 - 여기에 배열의 정적의 SQL (때문에 다른 값으로 변경하지 않는 SQL 쿼리)이 작업을 수행하는 방법을 예입니다 :
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;
from https://stackoverflow.com/questions/18797608/update-multiple-rows-in-same-query-using-postgresql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 포스트 그레스에서 재설정 자동 증가 카운터 (0) | 2020.04.17 |
---|---|
[SQL] 방법에 2008 SQL Server를 사용하여 해제 IDENTITY_INSERT를 켭니다? (0) | 2020.04.17 |
[SQL] 열이 MySQL은 비어 있거나 null의 경우는 어떻게 확인합니까? (0) | 2020.04.17 |
[SQL] 어떻게 SQL Server의 특정 날짜보다 큰 모든 날짜에 대해 쿼리합니까? (0) | 2020.04.17 |
[SQL] 응용 프로그램에서 SQL 대에서 계산을 수행의 장점과 단점은 무엇입니까 (0) | 2020.04.17 |