2012-11-09 7 views
18

Mam zapytanie jak to (w zależności):Nie aktualizuj kolumnę jeśli wartość jest null aktualizacja

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; 

Gdzie param_x jest parametrem mojej funkcji. Czy istnieje sposób NIE aktualizowania kolumn, dla których parametr jest NULL? Na przykład - jeśli param_4 i param_5NULL, zaktualizuj tylko pierwsze trzy kolumny i pozostaw stare wartości dla column_4 i column_5.

Tak jak ja to robię teraz to:

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; 

Czy istnieje lepszy sposób?

+0

myślę, że to do zrobienia. –

Odpowiedz

39

Rzuć SELECT, nie ma potrzeby, wystarczy użyć bieżącej wartości:

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

Dodatkowo, aby uniknąć pustych aktualizacje:

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

Neat sztuczkę, dzięki Przemek, Frank & Erwin!

Proponuję drobną zmianę do odpowiedzi Erwina, aby uniknąć pustych aktualizacji. Jeśli jakiekolwiek parametry były zerowe (co oznacza: "użyj starej wartości"), wiersz był aktualizowany za każdym razem, mimo że wartości wierszy się nie zmieniły (po pierwszej aktualizacji).

Dodając "param_x IS NOT NULL" unikamy pustych aktualizacje:

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

Dobrze, to jeszcze lepiej. Jeśli wszystkie zaangażowane kolumny są zdefiniowane jako "NOT NULL", to moja wersja zawiera już NULL w parametrach. Nie jest to mało prawdopodobne w przypadku, gdy OP uniemożliwia wprowadzenie nowych wartości NULL w UPDATE. –