2010-02-01 43 views
32

Làm cách nào để cập nhật bảng và đặt các giá trị khác nhau khi điều kiện đánh giá là True.MySQL - Sử dụng Nếu sau đó khác trong MySQL UPDATE hoặc SELECT truy vấn

Ví dụ:

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

Tôi đã thấy biểu CASE và NẾU biểu hiện trong thủ tục và chức năng nhưng tôi muốn sử dụng nó trong một bản cập nhật lựa chọn công bố đơn giản /. Có thể hay tôi đang mong đợi quá nhiều từ cơ sở dữ liệu mã nguồn mở đáng yêu này?

Trả lời

41
UPDATE table 
SET A = IF(A > 0 AND A < 1, 1, IF(A > 1 AND A < 2, 2, A)) 
WHERE A IS NOT NULL; 

bạn có thể muốn sử dụng CEIL() nếu A luôn luôn là một giá trị dấu chấm > 0<= 2

+0

Giá trị của A một chỉ là ví dụ. Tôi muốn áp dụng nó vào bất kỳ điều kiện nào. Ví dụ: NẾU KHÔNG IS NULL SET thành 'Một số giá trị Varchar' ELSE SET thành 'Một số giá trị Varchar khác'; Tôi sẽ đưa ra giải pháp của bạn một shot và xem nó hoạt động như thế nào. Cảm ơn rất nhiều! – ThinkCode

+0

bạn có một refference những gì bạn đang làm? Tôi không thể nhìn thấy nó vào lúc này .. – inetphantom

6

Dưới đây là một truy vấn để cập nhật một bảng dựa trên sự so sánh giữa bảng khác. Nếu bản ghi không được tìm thấy trong bảngB, nó sẽ cập nhật giá trị "hoạt động" thành "n". Nếu được tìm thấy, sẽ đặt giá trị thành NULL

UPDATE tableA 
LEFT JOIN tableB ON tableA.id = tableB.id 
SET active = IF(tableB.id IS NULL, 'n', NULL)"; 

Hy vọng điều này sẽ giúp người khác.

16

Trong khi bạn chắc chắn thể sử dụng chức năng lưu IF() kiểm soát MySQL của as demonstrated by dbemerlin's answer, tôi nghi ngờ nó có thể là một chút rõ ràng hơn để người đọc (tức là chính mình, và bất kỳ nhà phát triển trong tương lai những người có thể nhận mã của bạn trong tương lai) sử dụng một CASE biểu hiện thay vì:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     ELSE A 
     END 
WHERE A IS NOT NULL 

Tất nhiên, trong ví dụ cụ thể này đó là một chút lãng phí để thiết lập A cho chính nó trong ELSE khoản-tốt hơn hoàn toàn để lọc điều kiện như vậy từ UPDATE, thông qua mệnh đề WHERE:

UPDATE Table 
SET A = CASE 
     WHEN A > 0 AND A < 1 THEN 1 
     WHEN A > 1 AND A < 2 THEN 2 
     END 
WHERE (A > 0 AND A < 1) OR (A > 1 AND A < 2) 

(Sự bất bình đẳng đòi hỏi A IS NOT NULL).

Hoặc, nếu bạn muốn các khoảng phải đóng cửa chứ không phải là mở (lưu ý rằng điều này sẽ thiết lập giá trị của 0-1 -Nếu đó là mong muốn, người ta có thể lọc một cách rõ ràng những trường hợp như trong mệnh đề WHERE, nếu không thêm một cao hơn ưu tiên WHEN điều kiện):

UPDATE Table 
SET A = CASE 
     WHEN A BETWEEN 0 AND 1 THEN 1 
     WHEN A BETWEEN 1 AND 2 THEN 2 
     END 
WHERE A BETWEEN 0 AND 2 

Mặc dù, như dbmerlin cũng chỉ ra, đối với tình hình cụ thể này, bạn có thể xem xét sử dụng CEIL() thay vì:

UPDATE Table SET A = CEIL(A) WHERE A BETWEEN 0 AND 2 
+1

Đây là bản trình bày gọn gàng hơn và hoạt động phổ biến ngay cả khi có nhiều hơn hai điều kiện. Giải pháp câu lệnh 'if()' được cung cấp bởi @dbemerlin đòi hỏi phải lồng ghép hai điều kiện, điều này sẽ làm cho logic trở nên khó đọc và dễ hiểu hơn. –

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