如何使用IF条件过滤SELECT结果?

时间:2015-06-18 14:39:07

标签: sql sql-server tsql

我有一个返回所有员工的SQL查询。它给了我一个错误,因为它期望在WITH( )之后,它需要一个SELECT语句。

但如果我想第二次过滤结果,我该如何使用IF-ELSE IF?

注意:我的SQL可能听起来有些混乱(即:如果@Gender =男性,寻找所有单个员工),因为这些是占位符,我代替了我的真实SQL。我为在命名方面没有太多创意而道歉。

DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'

/* Store all employees aged 50+ in a variable called queryResult */
WITH queryResult AS
(
    SELECT * FROM Employees WHERE Age >= 50
)

/* If Gender = Male, I'm looking for all employees that are single */
IF @Gender = 'Male'
BEGIN
    SELECT * From queryResult WHERE Status = 'Single'
END

/* If Gender = Female, I'm looking for all employees that are married */
ELSE IF @Gender = 'Female'
BEGIN
    SELECT * From queryResult WHERE Status = 'Married'
END

已解决:如果您想查看我的真实查询,这是基于Rahul答案的工作查询。

WITH queryResult AS
    (
        SELECT TOP 1 t.userName, t.timeStamp
        FROM [Tracking].[dbo].[Tracking] t join (SELECT URL, PrimaryOwner FROM Governance WHERE Content = @Content) g
        ON t.referringURL like g.URL 
        WHERE 
            timeStamp >= 
                CASE WHEN @Frequency = 'Daily' THEN CAST(GETDATE() As Date)
                WHEN @Frequency = 'Monthly' THEN DATEADD(month, -1, CAST(GETDATE() As Date))
                WHEN @Frequency = 'Annually' THEN DATEADD(year, -1, CAST(GETDATE() As Date))
            END
            and PrimaryOwner = t.userName

        ORDER BY timestamp desc
    )

    SELECT * from queryResult

3 个答案:

答案 0 :(得分:3)

为什么不呢:

DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female';

WITH queryResult AS
(
    SELECT * FROM Employees WHERE Age >= 50
)
SELECT * From queryResult WHERE Gender = @Gender

编辑:

如果您的WHERE条款非常不同,那么最好将条件放在外面。将相同的cte或子查询放在倍数位置有点冒犯开发人员的眼睛,但它可能是正确的答案。

所以用你过于简单的例子来表明:

DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'

IF @Gender = 'Male'
BEGIN
    ;WITH queryResult AS
    (
        SELECT * FROM Employees WHERE Age >= 50
    )
    SELECT * From queryResult WHERE Gender = 'Male'
END

ELSE IF @Gender = 'Female'
BEGIN
    ;WITH queryResult AS
    (
        SELECT * FROM Employees WHERE Age >= 50
    )
    SELECT * From queryResult WHERE Gender = 'Female'
END

答案 1 :(得分:1)

为什么不在CTE本身进行过滤,如

IWorkbook workbook = WorkbookFactory.Create(inputStream);

编辑:在这种情况下,使用ISheet sheet = workbook.GetSheetAt(sheetIndex); 表达式更改您的CTE,如下所示

DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'

WITH queryResult AS
(
    SELECT * FROM Employees WHERE Age >= 50 AND Gender = @Gender
)    
select * from queryResult;

答案 2 :(得分:0)

你可以这样做:

DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'

WITH queryResult AS
(
    SELECT * FROM Employees WHERE Age >= 50
)
select *
from queryResult
where
    (@Gender = 'Male' and Status = 'Single')
    or (@Gender = 'Female' and Status = 'Married')