0
SELECT *,
    CASE 
    when PERSONNUM in ('x','y','z')
    then 'Home'
    end as HomeEmployees
    when PERSONNUM in ('a','b','c')
    then 'Away'
    end as AwayEmployees
FROM dbo.ALLTOTALS
where PERSONNUM in ('a','b','c','x','y','z')
    and HomeEmployees is not null

--multiple whens 基于选择的 PERSONNUM 字段

4

3 回答 3

2

为什么不修改你的WHERE条款

where HomeEmployees is not null

进入

WHERE PERSONNUM IN ('x', 'y', 'z')

所以只选择值为x , y, zin 列PERSONNUM的记录。

于 2013-09-25T19:33:09.490 回答
0

您还可以将案例投影到别名中,然后使用外部查询对其进行过滤,如下所示:

SELECT * -- Or better still, explicitly identify each needed column
FROM
(
  SELECT *, -- Or better still, explicitly identify each needed column
    CASE 
        WHEN PERSONNUM in ('x','y','z')
        THEN 'Home'
        END AS HomeEmployees
    FROM AllTotals
) AS FilteredEmployees 
WHERE 
  FilteredEmployees.HomeEmployees IS NOT NULL;

或作为 CTE:

WITH FilteredEmployees AS
(
  SELECT *, 
    CASE 
        WHEN PERSONNUM in ('x','y','z')
        THEN 'Home'
        END AS HomeEmployees
    FROM AllTotals
)
SELECT *
  FROM FilteredEmployees
  WHERE FilteredEmployees.HomeEmployees IS NOT NULL;
于 2013-09-25T19:46:49.387 回答
0

以下语句的执行逻辑顺序(参见“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;

  1. 来自@myTable x
  2. WHERE EmployeeID 不为 NULL(<=> WHERE x.EmployeeID 不为 NULL)
  3. 选择 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;

注意:使用与列名同名的别名不是一个好主意。这会造成混乱。

于 2013-09-25T19:49:00.650 回答