2015-02-09 64 views
-1

我正在使用SQL Server 2008 R2。我想在派生的列上有一個WHERE子句。如何根據派生列名稱篩選WHERE子句中的數據?

我有這樣的事情:

SELECT ActualColumn1, 
CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1 
FROM 
... 
WHERE 
DerivedColumn1 <> 'Foo' -- I'd like to filter on the derived column 

運行此查詢報告錯誤「無效列名DerivedColumn1」。

+1

您必須再次在'where'子句中重寫語句或使用子查詢來引用它。 – 2015-02-09 13:31:44

+0

啊,我明白了。謝謝。 – 2015-02-09 13:32:10

回答

3

不能從WHERE直接引用一個別名(你可能ORDER BY),你必須使用一個子查詢或CTE(或重複在WHERECASE WHEN):

WITH CTE AS 
(
    SELECT ActualColumn1, 
    CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1 
    FROM 
    ... 
) 
SELECT ActualColumn1, DerivedColumn1 
FROM CTE 
WHERE DerivedColumn1 <> 'Foo' 

相關:Reference alias (calculated in SELECT) in WHERE clause

0

你不能直接使用它,但你可以這樣做:

select * from 
(
SELECT ActualColumn1, 
CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1 
FROM 
... 
) 
WHERE 
DerivedColumn1 <> 'Foo' -- I'd like to filter on the derived column 
2

雖然派生列不可用直接給你,你有幾種方法來達到預期的效果:

  1. 使用相同的表達直接 - 這是不理想的,因爲你需要重複自己,但對於小表情往往是可以接受的
  2. 包裹內的另一個選擇一個選擇 - 這種方法可以讓你在的列過濾內部選擇在外部選擇的WHERE子句中。
  3. 使用Common Table Expression - 此方法與上述類似,因爲它允許您將選擇內容包裝在可以使用命名列的另一個結構(CTE)中。

這裏是最後一種方法的說明:

WITH CTE (ActualColumn1, DerivedColumn1) 
AS 
(
    SELECT ActualColumn1, 
    CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1 
    FROM ... 
) 
SELECT ActualColumn1, DerivedColumn1 
FROM CTE 
WHERE DerivedColumn = ... 
1
SELECT * FROM (
SELECT ActualColumn1, 
CASE WHEN condition THEN value1 ELSE value2 AS DerivedColumn1 
FROM 
... 
) Z 
WHERE 
DerivedColumn1 <> 'Foo' 

注: 如果使用子查詢,給ALIAS名稱查詢是強制如圖上文ž否則錯誤將被拋出。