복붙노트

[SQL] PostgreSQL의를 사용하여 동일한 쿼리에서 여러 행을 업데이트

SQL

PostgreSQL의를 사용하여 동일한 쿼리에서 여러 행을 업데이트

나는 한 성명에서 PostgreSQL의 여러 행을 업데이트 할 찾고 있어요. 다음과 같은 것을 할 수있는 방법이 있나요?

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

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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;
    
  7. from https://stackoverflow.com/questions/18797608/update-multiple-rows-in-same-query-using-postgresql by cc-by-sa and MIT license