2012-11-09 37 views
18

Tôi có một câu hỏi như thế này (trong một hàm):Không cập nhật cột nếu cập nhật giá trị là null

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; 

đâu param_x là một tham số chức năng của tôi. Có cách nào để KHÔNG cập nhật các cột đó, với tham số là NULL? Ví dụ: nếu param_4param_5NULL, thì chỉ cập nhật ba cột đầu tiên và để nguyên giá trị cũ cho column_4column_5.

Con đường tôi đang làm nó bây giờ là:

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ó cách nào tốt hơn?

+0

Tôi nghĩ đó là con đường để đi. –

Trả lời

39

Thả câu lệnh SELECT, không có nhu cầu, chỉ cần sử dụng giá trị hiện tại:

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

Bên cạnh đó, để tránh trống cập nhật:

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

lừa gọn gàng, nhờ Przemek, Frank & Erwin!

Tôi đề xuất chỉnh sửa nhỏ cho câu trả lời của Erwin để tránh các bản cập nhật trống. Nếu bất kỳ tham số nào là null (nghĩa là: "sử dụng giá trị cũ"), hàng được cập nhật mỗi lần mặc dù giá trị hàng không thay đổi (sau lần cập nhật đầu tiên).

Bằng cách thêm "param_x IS NOT NULL", chúng tôi tránh cập nhật rỗng:

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

Đúng, điều đó thậm chí còn tốt hơn. Nếu tất cả các cột liên quan được định nghĩa 'NOT NULL', thì phiên bản của tôi đã bao gồm NULL trong các tham số. Không có trường hợp nào, trong đó OP không cho phép các giá trị NULL mới trong CẬP NHẬT. –

Các vấn đề liên quan