2012-03-15 26 views
6

Tôi muốn cập nhật một bảng trong MySQL như thế này:Làm thế nào để sử dụng Nếu Sau đó Khác trong một truy vấn cập nhật MySQL?

UPDATE Table 
SET A = '20' IF A > 20 
SET A = A IF A < 20 
SET A = 0 IF A <= 1 
WHERE A IS NOT NULL; 

Nhưng SQL trên không phải là hợp lệ Cú pháp. Tôi cũng đã thử điều này:

UPDATE table 
SET A = IF(A > 20, 20, IF(A < 20, A, 0)); 

Nhưng cũng không hợp lệ Cú pháp. Làm cách nào để sử dụng câu lệnh if trong truy vấn cập nhật như thế này?

+1

Bạn không cần trường hợp thứ hai. Đặt A = A không làm gì cả. Lọc điều này trong mệnh đề where, nên nhanh hơn: 'WHERE A NOT NOT NULL AND (A> 20 OR A <= 1)' – Andre

Trả lời

9

Tôi nghĩ rằng bạn là 99% đó:

UPDATE table 
SET A = IF(A > 20, 20, IF(A < 20 && A > 1, A, 0)) 
WHERE A IS NOT NULL; 

Thêm && A > 1 đến thứ hai NẾU tuyên bố và điều kiện thứ ba của bạn được thỏa mãn.

Edit:

mỗi @ bình luận của Andre cho câu hỏi và gợi ý rằng lồng nhau IF là khó đọc, bạn cũng có thể làm điều này như một vài truy vấn mà không làm bất kỳ công việc không cần thiết và có thể đọc:

UPDATE table SET A = 20 WHERE A > 20; 
UPDATE table SET A = 0 WHERE A <= 1; 

Khi A là NULL, nó sẽ không đáp ứng một trong các điều kiện, và do đó loại bỏ sự cần thiết phải xác định rằng A không được NULL.

Tiếp theo, không cần điều kiện thứ ba như @Andre đề xuất. Nếu A nằm trong khoảng từ 1 đến 20, nó sẽ bị bỏ qua.

Cuối cùng, đặt A đến 0 trong đó A nhỏ hơn hoặc bằng 1 có vẻ không bình thường. Giá trị của 1 sẽ được thay đổi thành 0. Nếu bạn dự định chỉ đơn giản đặt giá trị nhỏ hơn 1 (bao gồm giá trị âm) thành 0, thì bạn nên đổi < cho <=.

+0

Bạn có nghĩ rằng điều đó dễ đọc không? tôi không! –

5
UPDATE Table 
SET A = Case 
When A > 20 Then 20 
When A <= 1 Then 0 
End 
WHERE A IS NOT NULL and (A > 20 or A <= 1) 

hoặc đơn giản hơn, 2 báo cáo

UPDATE Table 
SET A = 20 
where A > 20; 

UPDATE Table 
SET A = 0 
where A <= 1; 
+1

Không nên bỏ qua các dấu nháy đơn để sử dụng các giá trị int (chứ không phải là một chuỗi ký tự như '20' và 'A', v.v ...)? – JYelton

+0

minh họa của nó, bản gốc của ông có sự không phù hợp loại tương tự tôi không muốn đoán –

+0

Điểm tốt. Mặc dù nếu giá trị được lưu trữ là int, so sánh nó với '20' sẽ hoạt động trong mysql, tương tự như vậy thiết lập nó thành '20' cũng sẽ hoạt động, vì mysql sẽ đánh giá và chuyển đổi chuỗi <-> int. Tuy nhiên 'A' sẽ dẫn đến lỗi loại. – JYelton

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