2010-07-27 30 views
31

Tôi có một truy vấn lớn sử dụng trường hợp /khi thường là. Bây giờ tôi có SQL này ở đây, mà không hoạt động.Làm cách nào để sử dụng T-SQL's Case/When?

(select case when xyz.something = 1 
then 
    'SOMETEXT' 
else 
     (select case when xyz.somethingelse = 1) 
     then 
      'SOMEOTHERTEXT' 
     end) 

     (select case when xyz.somethingelseagain = 2) 
     then 
      'SOMEOTHERTEXTGOESHERE' 
     end) 
end) [ColumnName], 

Vấn đề gây phiền toái là xyz.somethingelseagain = 2, nó nói rằng nó không thể ràng buộc biểu thức đó. xyz là một số bí danh cho một bảng được nối sâu hơn trong truy vấn. Có gì sai ở đây? Loại bỏ một trong 2 trường hợp/whens sửa chữa đó, nhưng tôi cần cả hai trường hợp, thậm chí có thể nhiều trường hợp hơn.

Trả lời

74
SELECT 
    CASE 
    WHEN xyz.something = 1 THEN 'SOMETEXT' 
    WHEN xyz.somethingelse = 1 THEN 'SOMEOTHERTEXT' 
    WHEN xyz.somethingelseagain = 2 THEN 'SOMEOTHERTEXTGOESHERE' 
    ELSE 'SOMETHING UNKNOWN' 
    END AS ColumnName; 
+0

Works, whats sự khác biệt? :) – grady

+2

Cho phép nói rằng tôi có một số con gà trống làm bản sao, như sau: KHI xyz.something = 1 và xyz.abc = 2 THEN 'SOMETEXT' KHI xyz.something = 1 và xyz.abc <> 2 THEN 'SOMEOTHERTEXT' Bằng cách nào đó tôi có thể nói rằng nếu lần đầu tiên được thiết lập thì những cái sắp tới sẽ bị bỏ qua? Cái gì đó thoát khỏi vụ án/khi nào? – grady

4

Ngay khi câu lệnh WHEN đúng là ngắt là ẩn.

Bạn sẽ phải đồng ý xem WHEN Expression nào có nhiều khả năng xảy ra nhất. Nếu bạn đặt WHEN ở cuối danh sách dài WHEN, sql của bạn có thể chậm hơn. Vì vậy, đặt nó lên phía trước là người đầu tiên.

biết thêm thông tin ở đây: break in case statement in T-SQL

+0

Điều này đúng với rất nhiều thời gian, nhưng không được bảo đảm: http://sqlperformance.com/2014/06/t-sql-queries/dirty-secrets-of-the-case-expression – RobD

0
declare @n int = 7, 
    @m int = 3; 

select 
    case 
     when @n = 1 then 
      'SOMETEXT' 
    else 
     case 
      when @m = 1 then 
       'SOMEOTHERTEXT' 
      when @m = 2 then 
       'SOMEOTHERTEXTGOESHERE' 
     end 
    end as col1 
-- n=1 => returns SOMETEXT regardless of @m 
-- n=2 and m=1 => returns SOMEOTHERTEXT 
-- n=2 and m=2 => returns SOMEOTHERTEXTGOESHERE 
-- n=2 and m>2 => returns null (no else defined for inner case) 
Các vấn đề liên quan