2012-03-15 29 views
15

Dòng mã này là một đoạn trích từ câu lệnh chọn của tôi.Tham chiếu cột được tính toán trong mệnh đề where SQL

frdFreedays - DateDiff(dd,conReceiptToStock,GetDate()) As FreeDaysRemaining 

Dưới đây là một đoạn trích từ mệnh đề where

and frdFreedays - DateDiff(dd,conReceiptToStock,GetDate()) <= @intFreeDays 

tôi Câu hỏi tôi có là làm thế nào tôi có thể tham khảo cột FreeDaysRemaining và vì vậy tôi có thể so sánh nó với @intFreeDays

Tôi đang tìm kiếm cho một cái gì đó như thế này

Freedays <= @intFreeDays 

Trả lời

8

Ngoài câu trả lời của A-rôn, bạn có thể sử dụng một biểu thức bảng chung:

;with cte_FreeDaysRemaining as 
    (
     select 
      frdFreedays - DateDiff(dd,conReceiptToStock,GetDate()) As FreeDaysRemaining 
      --, more columns 
     from yourtable 
    ) 
    select 
     FreeDaysRemaining 
     --, more columns 
    from cte_FreeDaysRemaining 
    where FreeDaysRemaining <= @intFreeDays 
+0

Bất kỳ đầu vào nào về lý do tại sao đây là lựa chọn tốt hơn? :) –

+0

Không, ngoại trừ sở thích cá nhân của tôi là sử dụng CTE thay vì một bảng có nguồn gốc. – Joey

21

Bạn không thể tham khảo một ở bất kỳ đâu ngoại trừ ORDER BY. Một cách giải quyết khác (ngoài khả năng hiển nhiên của việc lặp lại expression) là đặt nó trong một bảng có nguồn gốc:

SELECT FreeDaysRemaining --, other columns 
FROM 
(
    SELECT frdFreedays - DATEDIFF(DAY, conReceiptToStock, GETDATE()) AS FreeDaysRemaining 
    --, other columns 
    FROM ... 
) AS x 
WHERE FreeDaysRemaining <= @intFreeDays; 
+0

này là điều điên rồ mà không có giải pháp nào khác ngoài điều này. Có một tuyên bố cụ thể để thêm điều kiện trên resultset sẽ đơn giản để tạo (tôi nghĩ). Có hàm 'HAVING' cho hàm tổng hợp, tại sao không phải là' FILTER' cho resultset. Ok, đây sẽ là một tuyên bố thứ ba trong một truy vấn, loại lộn xộn nhưng khi bạn có một lựa chọn với 20 cột để viết hai lần vì một điều kiện đơn giản, điều này thực sự lộn xộn và một nỗi đau trong *** để duy trì. – AxelH

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