2014-07-01 2 views
2

기본값이 설정된 열이 있습니다. 이 같은 UPDATE 문은 예상대로 작동합니다INSERT/UPDATE 문에서 DEFAULT 사용 vs 사례

UPDATE some_table SET 
    some_column = DEFAULT 
WHERE id = 1; 

을하지만, 나는이 같은 조건을 사용하려고하면, 내가 DEFAULT 근처에 구문 오류 :

UPDATE some_table SET 
    some_column = CASE 
    WHEN TRUE THEN DEFAULT 
    ELSE 'foo' 
    END 
WHERE id = 1; 

유효한 방식이 있는가 기대 한 결과를 얻으시겠습니까?

+2

옵션은 표현식 또는 마법 단어 'DEFAULT'입니다. 'DEFAULT'는 표현식 내부의 임의의 위치에 나타날 수 없습니다. –

+1

아니요. '사실 인 경우 순서대로', '오름차순으로 끝내기'를 할 수없는 것처럼 말입니다. 함수의 일부가 아닌 구문의 일부입니다. – Bohemian

+0

이렇게 극복 할 방법이 없습니까? 나는'DEFAULT'를 사용하는 대신 명시 적으로 값을 기술 할 수 있다는 것을 알고 있지만 그것은 기이합니다. 또한 컨트롤 구조와 함께 저장 프로 시저를 사용할 수도 있지만 단순 업데이트의 경우 조금 지나치게 과장되지는 않습니까? – Przemek

답변

2

당신은 그렇게 할 수 없습니다. 이 표현식을 또는DEFAULT 키워드를 사용할 수 있습니다.

SET { column = { expression | DEFAULT } | ... }

그러나이 업데이트에 검색어를 나눌 수 있습니다 :이 원하는 변경을 할 것입니다

UPDATE some_table 
SET some_column = DEFAULT 
WHERE id = 1 AND some_condition; 

UPDATE some_table 
SET some_column = 'foo' 
WHERE id = 1 AND NOT some_condition; 

. AND NOT some_condition 의도적으로 생략 :

WITH upd1 AS (
    UPDATE some_table 
    SET some_column = DEFAULT 
    WHERE id = 1 AND some_condition 
    RETURNING * 
), 
upd2 AS (
    UPDATE some_table 
    SET some_column = 'foo' 
    WHERE id = 1 
    RETURNING * 
) 
SELECT * FROM upd1 
UNION ALL 
SELECT * FROM upd2 

: 당신이 정말로 하나 개의 쿼리에서 그것을하고 싶은 경우에, 당신은 CTE의를 사용할 수 있습니다. 마지막 CTE는 CASE 표현식의 ELSE 분기와 정확히 일치 할 수 있습니다. 이는 CTE를 수정하는 데이터를 여러 개 사용하는 경우 테이블 내에 maximum one of them can affect every row이 있기 때문입니다.