2013-05-04 46 views
2

我的查詢是這樣的。使用臨時列來過濾結果

select id,name,salary,(salary-2000) AS [Deductedsalary] 
from EmployeeDetails 

我想在where子句中使用[Deductedsalary]列,類似於下面的查詢。

select 
    id, name, salary, (salary-2000) AS [Deductedsalary] 
from 
    EmployeeDetails 
where 
    [Deductedsalary] > 5000 

注:我不希望使用過濾器的查詢與「工資」列

回答

2

您可以使用子查詢來定義其他外S:

select * 
from (
     select salary-2000 as deducted_salary 
     ,  * 
     from 
       EmployeeDetails 
     ) SubQueryAlias 
where Deductedsalary > 5000 
+0

我剛剛錯過了一些......我發佈了類似的答案。我會將其標記爲已刪除:) – 2013-05-04 11:12:33

+0

@ARS:你實際上在我之前張貼過。你可以在一段時間內懸停以獲得確切的時間戳(11:10:19 vs 11:10:00)。如果你取消刪除你的回答,我會將它投票:) – Andomar 2013-05-04 11:22:53

+0

嘿,我沒有意識到這一點。我已經取消了我的回答。 – 2013-05-04 18:03:14

2

你不能直接這樣做 - 你必須對底層Salary列,或用途過濾器類似的CTE:

WITH CTE AS 
(
    SELECT 
     id, name, salary, 
     DeductedSalary = salary - 2000 
    FROM 
     dbo.EmployeeDetails 
) 
SELECT 
    id, name, salary, DeductedSalary 
FROM 
    CTE 
WHERE 
    [Deductedsalary] > 5000 
1

您可以嘗試

Select * 
    FROM 
    (
     select 
      id, name, salary, (salary-2000) AS [Deductedsalary] 
     from 
      EmployeeDetails 

    ) data 
    where 
      [Deductedsalary] > 5000 
2

另一種方法是

SELECT id, 
     name, 
     salary, 
     DeductedSalary 
FROM EmployeeDetails 
CROSS APPLY (SELECT salary-2000) DS(DeductedSalary) 
WHERE DeductedSalary > 5000 

雖然我會使用

SELECT id, 
     name, 
     salary, 
     (salary - 2000) AS [Deductedsalary] 
FROM EmployeeDetails 
WHERE [salary] > 7000 

因爲這是優化搜索(可以使用索引,將有更好的基數估計)

+1

薪水指數會很不尋常?該問題還表示「我不想在'salary'列中使用過濾器查詢」 – Andomar 2013-05-04 11:23:55

+0

@Andomar - 取決於他們需要運行這樣的查詢的頻率,以確定它是否應該被索引。當有明顯的可選擇的替代方案時避免不可靠的表達是一種最佳實踐,無論OP表示他們想要什麼,但我會爲答案增加另一種方式。 – 2013-05-04 11:26:47