2017-10-25 3 views
0

CASE를 사용하여 여러 행을 업데이트하려고합니다. Oracle sql, CASE를 사용하여 여러 행을 업데이트하십시오.

UPDATE GRIDCOLUMNS 
SET TYPE= CASE 
    WHEN (Fieldname = 'AccountNum' AND ID = 19337) THEN 6 
    WHEN (Fieldname = 'AccountNum' AND ID = 19339) THEN 6 
    WHEN (Fieldname = 'AccountNum' AND ID = 19380) THEN 6 
    WHEN (Fieldname = 'AccountNum' AND ID = 19419) THEN 6 
    END; 

내가 그것을 실행

아래의 코드, 나는 다음과 같은 오류 얻을 :

Error starting at line 1 in command: 
UPDATE GRIDCOLUMNS 
SET TYPE= CASE 
    WHEN (Fieldname = 'AccountNum' AND ID = 19337) THEN 6 
    WHEN (Fieldname = 'AccountNum' AND ID = 19339) THEN 6 
    WHEN (Fieldname = 'AccountNum' AND ID = 19380) THEN 6 
    WHEN (Fieldname = 'AccountNum' AND ID = 19419) THEN 6 
    END 
Error report: 
SQL Error: ORA-01407: cannot update ("WEB"."GRIDCOLUMNS"."TYPE") to NULL 
01407. 00000 - "cannot update (%s) to NULL" 
*Cause:  
*Action: 

어떤 문제가 될 수 있습니까?

+0

문제는 'ELSE' 절이없는'CASE' 표현식은 일치하는 검색 표현식이 없으면 'null'로 평가된다는 것입니다. –

답변

2

case을 사용하지 마십시오. 대신 :

UPDATE GRIDCOLUMNS 
    SET TYPE = 6 
    WHERE Fieldname = 'AccountNum' AND ID IN (19337, 19339, 19380, 19419); 

이것은 훨씬 효율적입니다.

UPDATE GRIDCOLUMNS 
    SET TYPE = (CASE WHEN Fieldname = 'AccountNum' AND ID IN (19337, 19339, 19380, 19419) THEN 6 
        ELSE TYPE 
       END); 

가 그렇지 않은 경우, 일치하지 않는 행이 NULL로 설정 얻을 : 당신이 정말로 CASE를 사용해야하는 경우에, 당신은 ELSE이 필요합니다. 하지만 실제로는 WHERE을 사용하십시오.

+0

와우! 감사. 나는 이것을 11 분 안에 받아 들일 것으로 표시 할 것이다. –

+0

또는 모두 대신 업데이트하는 데 필요한 ID로 제한 할 위치. (하지만 설정하려는 값이 다른 경우에만 대소 문자가 필요합니다) – xQbert