2017-10-25 16 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); 

これははるかに効率的です。あなたが本当にCASEを使用する必要がある場合は、ELSEを必要とする:

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

そうでない場合は、一致しない行はNULLに設定します。しかし実際には、WHEREを使用してください。

+0

うわー!ありがとう。私はこれを11分後に受け入れるとマークします。 –

+0

またはすべてではなく更新するために必要なIDに制限する場所。 (ただし、設定する値が異なる場合は大文字と小文字が必要です) – xQbert

関連する問題