2012-11-09 19 views
18

Ho una domanda di questo tipo (in una funzione):Non aggiornare colonna se il valore di aggiornamento è nullo

UPDATE some_table SET 
    column_1 = param_1, 
    column_2 = param_2, 
    column_3 = param_3, 
    column_4 = param_4, 
    column_5 = param_5 
WHERE id = some_id; 

Dove param_x è un parametro di mia funzione. C'è un modo per NON aggiornare quelle colonne, per cui il parametro è NULL? Ad esempio, se param_4 e param_5 sono NULL, aggiornare solo le prime tre colonne e lasciare i valori precedenti per column_4 e column_5.

Il modo in cui lo sto facendo ora è:

SELECT * INTO temp_row FROM some_table WHERE id = some_id; 

UPDATE some_table SET 
    column_1 = COALESCE(param_1, temp_row.column_1), 
    column_2 = COALESCE(param_2, temp_row.column_2), 
    column_3 = COALESCE(param_3, temp_row.column_3), 
    column_4 = COALESCE(param_4, temp_row.column_4), 
    column_5 = COALESCE(param_5, temp_row.column_5) 
WHERE id = some_id; 

C'è un modo migliore?

+0

penso che sia la strada da percorrere. –

risposta

39

cadere l'istruzione SELECT, non v'è alcuna necessità di, basta usare il valore corrente:

UPDATE some_table SET 
    column_1 = COALESCE(param_1, column_1), 
    column_2 = COALESCE(param_2, column_2), 
    column_3 = COALESCE(param_3, column_3), 
    column_4 = COALESCE(param_4, column_4), 
    column_5 = COALESCE(param_5, column_5) 
WHERE id = some_id; 
8

Inoltre, al fine di evitare vuoti aggiornamenti:

UPDATE some_table SET 
    column_1 = COALESCE(param_1, column_1), 
    column_2 = COALESCE(param_2, column_2) 
    ... 
WHERE id = some_id; 
AND (param_1 IS DISTINCT FROM column_1 OR 
     param_2 IS DISTINCT FROM column_2 OR 
     ... 
    ); 
10

trucco accurato, grazie Przemek, Frank & Erwin!

Suggerisco una modifica minore alla risposta di Erwin per evitare aggiornamenti vuoti. Se alcuni parametri erano nulli (che significa: "usa il vecchio valore"), la riga veniva aggiornata ogni volta anche se i valori delle righe non cambiavano (dopo il primo aggiornamento).

aggiungendo "param_x IS NOT NULL", evitiamo gli aggiornamenti vuoti:

UPDATE some_table SET 
    column_1 = COALESCE(param_1, column_1), 
    column_2 = COALESCE(param_2, column_2), 
    ... 
WHERE id = some_id 
AND (param_1 IS NOT NULL AND param_1 IS DISTINCT FROM column_1 OR 
     param_2 IS NOT NULL AND param_2 IS DISTINCT FROM column_2 OR 
    ... 
); 
+2

Giusto, è ancora meglio. Se tutte le colonne coinvolte sono definite 'NOT NULL', allora la mia versione copre già NULL nei parametri. Non improbabile per un caso, in cui l'OP non consente nuovi valori NULL in UPDATE. –

Problemi correlati