2012-02-27 38 views
15

Tôi đang tìm cách tạo báo cáo trường hợp trong truy vấn chọn sql sử dụng ít hơn và lớn hơn dấu. Ví dụ, tôi muốn chọn một bảng xếp hạng dựa trên một biến:Sử dụng các dấu hiệu so sánh bên trong câu lệnh dạng chữ sql

DECLARE @a INT 
SET @a = 0 

SELECT CASE 
     WHEN @a < 3 THEN 0 
     WHEN @a = 3 THEN 1 
     WHEN @a > 3 THEN 2 
     END 

Tôi muốn viết nó như:

DECLARE @a INT 
SET @a = 0 

SELECT CASE @a 
     WHEN < 3 THEN 0 
     WHEN 3 THEN 1 
     WHEN > 3 THEN 2 
     END 

... nhưng SQL không cho phép tôi sử dụng < và> dấu hiệu theo cách này. Có một cách mà tôi có thể làm điều này là SQL 2005, hoặc tôi cần phải sử dụng mã như trong lần đầu tiên.

Lý do chỉ muốn mã ở đó một lần là vì nó sẽ làm cho mã dễ đọc hơn/dễ bảo trì hơn và cũng bởi vì tôi không chắc liệu máy chủ SQL có phải chạy phép tính cho mỗi câu lệnh CASE hay không.

Tôi đang tìm kiếm một VB.NET tuyên bố trường hợp equivelent:

Select Case i 
    Case Is < 100 
     p = 1 
    Case Is >= 100 
     p = 2 
End Select 

Có lẽ nó không thể thực hiện trong SQL và đó là ok, tôi chỉ muốn xác nhận rằng.

+2

Lệnh 'CASE' đang làm việc như TRƯỜNG HỢP hoặc switch trong hầu hết các khác ngôn ngữ lập trình. Tôi không thấy điểm cần thiết của bạn. –

+0

Xin lỗi, kết thúc câu hỏi của tôi đã bị cắt. Hãy cho tôi biết nếu bạn vẫn không hiểu những gì tôi đang cố gắng đạt được – Greg

+0

Biểu thức CASE sẽ ngắn mạch và chỉ đánh giá các trường hợp cho đến khi và nếu một trong các trường hợp là đúng. Tôi không nghĩ có bất kỳ lợi thế nào với cách tiếp cận khác. –

Trả lời

19

Bạn có thể sử dụng các chức năng như SIGN

DECLARE @a INT 
SET @a = 0 

SELECT CASE SIGN(@a - 3) 
     WHEN -1 THEN 0 
     WHEN 0 THEN 1 
     WHEN 1 THEN 2 
     END 

Nếu @a là nhỏ hơn 3, sau đó @a - 3 kết quả trong một int tiêu cực, trong đó lợi nhuận SIGN -1.

Nếu @a từ 3 trở lên, thì SIGN trả về 0 hoặc 1, tương ứng.


Nếu đầu ra bạn muốn là 0, 1 và 2, sau đó bạn có thể đơn giản hóa hơn nữa:

DECLARE @a INT 
SET @a = 0 

SELECT SIGN(@a - 3) + 1 
+0

Cảm ơn, tôi sẽ cung cấp cho nó một đi – Greg

+0

Tôi không thấy làm thế nào điều này là duy trì hơn. Bất cứ ai biết SQl sẽ tìm thấy tuyên bố ban đầu rằng OP không thích nhưng nó hoạt động rõ ràng hơn. – HLGEM

+0

@HLGEM Tôi cũng đồng ý với bạn nếu '@ a' chỉ là một biểu hiện đơn giản, nhưng theo OP,' @ a' là một biểu thức phức tạp dài mà anh ta không muốn thấy lặp đi lặp lại ba lần trong một tuyên bố trường hợp. Vì vậy, tôi đoán giải pháp của tôi hoặc Andriy M là thích hợp để giải quyết vấn đề của mình. –

6

Sử dụng SIGN như suggested by @Jose Rui Santos dường như một cách giải quyết tốt đẹp. Một thay thế có thể là để gán biểu hiện một bí danh, sử dụng một subselect và kiểm tra các biểu hiện (sử dụng bí danh của nó) trong ngoài chọn:

SELECT 
    …, 
    CASE 
    WHEN expr < 3 THEN … 
    WHEN expr > 3 THEN … 
    END AS … 
FROM (
    SELECT 
    …, 
    a complex expression AS expr 
    FROM … 
    … 
) 
1
SELECT 
CASE 
WHEN ColumnName >=1 and ColumnName <=1 THEN 'Fail' 
WHEN ColumnName >=6 THEN 'Pass' 
ELSE 'Test' 
END 
FROM TableName 
+0

câu hỏi ban đầu là làm thế nào để tôi có được điều kiện không xuất hiện trên mọi dòng. Điều này không thực sự trả lời câu hỏi vì tôi vẫn phải lặp lại phương trình trên 2 dòng và giả sử khác – Greg

+0

Tôi không thể upvote điều này bởi vì nó không nhất thiết phải giải quyết câu hỏi ban đầu, nhưng nó giải quyết được vấn đề của tôi. Cảm ơn. Chỉ cần di chuyển ColumnName ra khỏi dòng "CASE" đến từng dòng "WHEN". – Ads

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