2011-06-27 58 views
6

Tôi có 4 trường hợp báo cáo chính xác giống như tiêu chuẩn CASE, nhưng tất cả đều có tuyên bố khác nhau THEN/ELSE.Có thể trả về nhiều cột bằng cách sử dụng câu lệnh 1 trường hợp không?

Có thể thực hiện tất cả điều này trong một hay không, hoặc tôi có cần tách riêng tất cả và sao chép và dán mã nhiều lần không?

,CASE WHEN lm.Id IN ('1','2','3') THEN lm.name ELSE lm.Desc END AS [Column1] 
,CASE WHEN lm.Id IN ('1','2','3') THEN '3' ELSE '1' END AS [Column2] 
,CASE WHEN lm.Id IN ('1','2','3') THEN 'True' ELSE 'False' END AS [Column3] 

Có thể thực hiện việc này bằng mã ít hơn không?

Trả lời

9

Tôi không nghĩ rằng điều này là có thể trong SQL nghiêm ngặt. Một số công cụ DB có thể hỗ trợ nó như là một phần mở rộng. Bạn có thể có thể thực hiện chức năng cùng một thứ thông qua một số cơ chế khác, mặc dù ... có thể với một JOIN, hoặc một UNION.

+0

Sql Server sẽ thất bại nếu bạn cố gắng tách riêng bất kỳ thứ gì trong một dấu phẩy, vì vậy rất có thể anh ta bị mắc kẹt với 3 trường hợp báo cáo – Limey

0

Ví dụ bạn đưa ra, tôi sẽ không cố thực hiện bất kỳ thay đổi nào. Nếu thử nghiệm của bạn (KHI ... THÌ) liên quan đến tính toán nhiều hơn, hoặc nếu nó được lặp lại nhiều lần, bạn có thể xem xét thiết lập một truy vấn con để đánh giá nó. Nhưng chỉ với một lượng nhỏ sự lặp lại, tại sao lại bận tâm? Mã bạn có là dễ đọc và không tốn kém để thực thi.

1

Đề xuất UNION nhập các kết quả của bạn. Nó sẽ không giúp bạn có ít dòng mã hơn, nhưng có lẽ dễ đọc hơn.

SELECT [name], '3', 'True' 
From Mytable WHERE ID IN ('1','2','3') 
UNION 
SELECT [desc], '1', 'False' 
From Mytable WHERE ID NOT IN ('1','2','3') 
+0

+1 dường như là cách tốt nhất để giải quyết vấn đề cụ thể này, tôi sẽ sử dụng UNION ALL để thay thế hiệu suất –

1

Tại sao bạn không thử dùng update bảng sử dụng where? Trong câu hỏi select câu hỏi của bạn, bạn có thể khai báo Column1, Column2Column3NULL và với hai tuyên bố update thay đổi giá trị.

Với "chỉ" ba cột tùy thuộc vào cùng một tuyên bố case mã dưới đây không tiết kiệm được nhiều đánh máy (có thể là thời gian thực hiện ..?) Nhưng nó đi kèm tiện dụng khi bạn có nhiều hơn 3 ...

UPDATE MyTable 
     SET Column1 = lm.name, 
      Column2 = '3', 
      Column3 = 'True' 
WHERE lm.Id IN ('1','2','3') 

UPDATE MyTable 
     SET Column1 = lm.Desc, 
      Column2 = '1', 
      Column3 = 'False' 
WHERE lm.Id NOT IN ('1','2','3') 
Các vấn đề liên quan