2010-01-19 35 views
9

Có cách nào trong TSQL để làm một cái gì đó như thế này:TSQL - Dùng Chọn Cột nguồn gốc trong mệnh đề where

select a,b,c, 
case 
    when a=1 then 5 
    when a=2 then 6 
end as d 
from some_table 
where d=6 

Những tuyên bố trường hợp thực tế là thực sự phức tạp, vì vậy tôi đang cố gắng để tránh lặp lại nó trong mệnh đề where? Có bất kỳ thủ thuật để làm điều này?

(Tôi nghĩ có một mẹo trong MySQL để sử dụng "có d = 6").

Trả lời

18
select a,b,c FROM(
select a,b,c, 
case 
    when a=1 then 5 
    when a=2 then 6 
end as d 
from some_table 
) AS t 
where d=6 
+0

Cảm ơn bạn, Alex –

2

Làm cho truy vấn được truy vấn phụ của bạn và chọn từ truy vấn đó ở đó d = 6. Theo tôi biết không có cách nào để tham chiếu cột có nguồn gốc trong cùng một truy vấn.

4

Đây là một nơi tốt để sử dụng CTEs, ví dụ:

WITH MassagedData (a, b, c, d) AS 
(
    select a, b, c, 
     case 
      when a=1 then 5 
      when a=2 then 6 
     end as d 
    from some_table 
) 

SELECT a,b,c 
FROM MassagedData 
where d=6 
+0

Wish này đã bỏ phiếu tán hơn vì nó ít nhiều ồn ào hơn so với câu trả lời được chấp nhận (spasibo!). – MushinNoShin

2

Tôi sẽ đồng ý với AlexKuznetsov trên thế này, nhưng tôi cũng muốn nói thêm rằng nếu truy vấn của bạn là (bất kể có bao nhiều hơn nữa phức tạp) giới hạn trong các trường hợp khoản WHERE tồn tại trong CASE, thì những trường hợp CASE sẽ không bao giờ được trả lại và không được chọn ở địa điểm đầu tiên.

Ví dụ, bạn đang thiết d để '6', nơi a là '2', sau đó hạn chế đến WHERE d = 6, vì vậy bạn thay vì có thể làm:

SELECT a,b,c, 
    6 AS d 
FROM some_table 
WHERE a = 2 

này sẽ trả lại kết quả tương tự trong một hơn tối ưu và sạch sẽ thời trang. Đây là lý do tại sao, IMHO, không có điểm trong việc có thể tham khảo một cột có nguồn gốc.

1

Một tùy chọn khác là triển khai câu lệnh case của bạn dưới dạng hàm. Đặc biệt tốt cho các vấn đề chuyển đổi hoặc tính toán. Điều tốt đẹp về chức năng là logic 'doanh nghiệp' ở một nơi và có thể dễ dàng được sử dụng lại trong các truy vấn khác.

-- sample code not tested 

CREATE FUNCTION dbo.fn_MyConvertA(
    -- Add the parameters for the function here 
    @a int 
) 
RETURNS int -- for example 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @ResultVar as int 

-- Add the T-SQL statements to compute the return value here 
set @ResultVar = case when @a = 1 then 5 when @a = 2 then 6 else 10 end 

-- Return the result of the function 
RETURN @ResultVar 

END 
GO 

-- now you case write your query 
select a,b,c, dbo.fn_MyConvertA(a) as d 
from some_table   
where dbo.fn_MyConvertA(a)=6 
0

Một phương pháp khác để này là sử dụng CROSS APPLY:

select a,b,c, 
from some_table 
CROSS APPLY (SELECT case 
        when a=1 then 5 
        when a=2 then 6 
        end) CxA(d) 
where d=6 
Các vấn đề liên quan