2009-12-07 35 views
10

Tôi có một câu lệnh cập nhật cập nhật các trường x, y và z trong đó id = xx.Trường Cập nhật Khi Không Null

Trong bảng, tôi có một vài trường khác nhau x_created_datetime (cho các phần khác nhau của bản ghi được duy trì/nhập bởi những người khác nhau). Tôi muốn viết một truy vấn duy nhất sẽ cập nhật trường này nếu là null, nhưng để nó một mình nếu không phải là null.

Vì vậy, những gì tôi có là:

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp" 
WHERE id = X 

Những gì tôi cần là một cách để thêm vào những điều sau đây, nhưng vẫn luôn cập nhật trên:

scan_created_date = "current_unix_timestamp" 
where scan_created_date is null 

Tôi hy vọng tôi có thể làm điều này mà không cần giao dịch thứ hai cho DB. Bất kỳ ý tưởng về cách thực hiện điều này?

Trả lời

28

Làm điều này:

UPDATE newspapers 
SET scan_notes = "data",  
    scan_entered_by = "some_name",  
    scan_modified_date = "current_unix_timestamp", 
    scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp") 
WHERE id = X 

Chức năng COALESCE chọn giá trị không null đầu tiên. Trong trường hợp này, nó sẽ cập nhật datestamp scan_created_date thành cùng một giá trị nếu nó tồn tại, nếu không nó sẽ lấy bất cứ thứ gì bạn thay thế "current_unix_timestamp" bằng.

+3

Nó có giá trị một lời giải thích ngắn gọn về lý do tại sao công trình này: liên hiệp trả về giá trị null đầu tiên trong danh sách các giá trị, vì vậy nếu scan_created_date là đã có , nó sẽ tự đặt thành giá trị đã có sẵn. Nếu nó là null, nó sẽ tự đặt cho dấu thời gian hiện tại. –

+0

Sẽ không cập nhật này scan_created_date khi nó là null? Có vẻ như anh ấy muốn cập nhật nó ở nơi nó không phải là rỗng. – tloach

+0

@tloach - xem giải thích. @JacobM - đã làm điều đó :) – cjk

1

Bạn có thể sử dụng liên hiệp() Mà trả về giá trị NON-NULL đầu tiên):

scan_created_date = COALESCE(scan_created_date, "current_unix_timestamp") 
4

Tôi nghĩ rằng những gì bạn đang tìm kiếm là IF()

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp", 
    scan_created_date = IF(scan_created_date IS NOT NULL, "current_unix_timestamp", NULL) 
WHERE id = X 
3

mySQL có chức năng IFNULL , vì vậy bạn có thể làm:

UPDATE newspapers 
SET scan_notes = "data", 
    scan_entered_by = "some_name", 
    scan_modified_date = "current_unix_timestamp" 
    scan_created_date = IFNULL(scan_created_date, "current_unix_timestamp") 
WHERE id = X 
1

Bạn có thể làm điều gì đó như sau:

UPDATE newspapers a, newspapers b 
SET a.scan_notes = "data",  
    a.scan_entered_by = "some_name",  
    a.scan_modified_date = "current_unix_timestamp", 
    b.scan_created_date = "current_unix_timestamp" 
WHERE a.id = X AND b.id = X AND b.scan_created_date is not NULL 
0

Tương tự như NVL của Oracle. Bạn có thể sử dụng nó như dưới đây trong một tuyên bố sẵn sàng sử dụng các thông số

UPDATE 
    tbl_cccustomerinfo 
SET 
    customerAddress = COALESCE(?,customerAddress), 
    customerName = COALESCE(?,customerName), 
    description = COALESCE(?,description) 
WHERE 
    contactNumber=? 
Các vấn đề liên quan