valores valor una tabla reemplazar que puede postgres por pero nulos nulo not modificar insertar inserción datos contener como columna campo agregar actualizar actualización postgresql plpgsql

valor - reemplazar null por 0 postgresql



No actualizar la columna si el valor de actualización es nulo (3)

Tengo una consulta como esta (en una función):

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;

Donde param_x es un parámetro de mi función. ¿Hay una manera de NO actualizar esas columnas, para las cuales el parámetro es NULL ? Por ejemplo, si param_4 y param_5 son NULL , entonces actualice solo las tres primeras columnas y deje los valores antiguos para column_4 y column_5 .

La forma en que lo estoy haciendo ahora es:

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;

¿Hay alguna manera mejor?


Además, para evitar actualizaciones vacías :

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 ... );


Buen truco, gracias Przemek, Frank y Erwin!

Sugiero una edición menor a la respuesta de Erwin para evitar actualizaciones vacías. Si alguno de los parámetros era nulo (lo que significa "usar el valor anterior"), la fila se actualizaba cada vez que los valores de la fila no cambiaban (después de la primera actualización).

Al agregar "param_x NO ES NULO", evitamos actualizaciones vacías:

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 ... );


Elimine la instrucción SELECT, no es necesario, solo use el valor actual:

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;