以下语句的执行逻辑顺序(参见“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;
注意:使用与列名同名的别名不是一个好主意。这会造成混乱。