以下语句的执行逻辑顺序(参见“SELECT 语句的逻辑处理顺序”部分)SELECT:
DECLARE @MyTable TABLE
(
    ID      INT IDENTITY PRIMARY KEY,
    [Date]  SMALLDATETIME NOT NULL,
    WorkingTime INT NOT NULL,
    EmployeeID  INT NULL
);
INSERT  @MyTable ([Date], WorkingTime, EmployeeID)
SELECT  '20130801', 1, 123 UNION ALL 
SELECT  '20130802', 0, 124 UNION ALL 
SELECT  '20130803', 0, 125; 
SELECT  x.ID,
        CASE WHEN x.ID % 2 = 1 THEN x.ID END AS EmployeeID
FROM    @MyTable x
WHERE   EmployeeID IS NOT NULL;
是
- 来自@myTable x
 
- WHERE EmployeeID 不为 NULL(<=> WHERE x.EmployeeID 不为 NULL)
 
- 选择 x.ID, CASE ... END AS EmployeeID
 
如您所见,CASE ... END AS EmployeeID表达式是在AFTER WHERE子句中求值的。这也意味着EmployeeID IS NOT NULL谓词引用x.EmployeeID列而不是EmployeeID别名 fromSELECT子句。
这就是我得到以下结果的原因:
ID          EmployeeID
----------- -----------
1           1
2           NULL
3           3
如果EmployeeID要按别名过滤,则可以使用以下解决方案之一:
SELECT  x.ID,
        CASE WHEN x.ID % 2 = 1 THEN x.ID END AS EmployeeID
FROM    @MyTable x
WHERE   CASE WHEN x.ID % 2 = 1 THEN x.ID END IS NOT NULL;
SELECT *
FROM
(
SELECT  x.ID,
        CASE WHEN x.ID % 2 = 1 THEN x.ID END AS EmployeeID
FROM    @MyTable x
) src
WHERE   src.EmployeeID IS NOT NULL;
注意:使用与列名同名的别名不是一个好主意。这会造成混乱。