Sql 如何使用IF条件过滤选择结果?
我有一个返回所有员工的SQL查询。它给我一个错误,因为它期望在Sql 如何使用IF条件过滤选择结果?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个返回所有员工的SQL查询。它给我一个错误,因为它期望在WITH()之后出现SELECT语句 但是如果我想再次过滤结果,我该如何使用if-ELSE-if呢 注意:我的SQL听起来可能有点令人困惑(即:如果@Gender=Male,则查找所有单身员工),因为这些是我放置在真实SQL位置的占位符。我很抱歉在命名上没有太多创造性 DECLARE @Gender VARCHAR(10) SET @Gender = 'Female' /* Store all employees aged 50+
WITH()
之后出现SELECT
语句
但是如果我想再次过滤结果,我该如何使用if-ELSE-if呢
注意:我的SQL听起来可能有点令人困惑(即:如果@Gender=Male,则查找所有单身员工),因为这些是我放置在真实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
您可以这样做:
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')
您可以这样做:
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')
为什么不只是:
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
为什么不只是:
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
为什么CTE中的过滤不象
DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'
WITH queryResult AS
(
SELECT * FROM Employees WHERE Age >= 50 AND Gender = @Gender
)
select * from queryResult;
编辑:在这种情况下,使用案例
表达式更改CTE,如下所示
DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'
WITH queryResult AS
(
SELECT * FROM Employees WHERE Age >= 50
AND Status = CASE WHEN @Gender = 'Male' THEN 'Single' ELSE 'Married' END
)
SELECT * FROM queryResult;
为什么CTE中的过滤不象
DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'
WITH queryResult AS
(
SELECT * FROM Employees WHERE Age >= 50 AND Gender = @Gender
)
select * from queryResult;
编辑:在这种情况下,使用案例
表达式更改CTE,如下所示
DECLARE @Gender VARCHAR(10)
SET @Gender = 'Female'
WITH queryResult AS
(
SELECT * FROM Employees WHERE Age >= 50
AND Status = CASE WHEN @Gender = 'Male' THEN 'Single' ELSE 'Married' END
)
SELECT * FROM queryResult;
查询结束时不需要OR语句。简单的性别=@Gender就足够了。@histia86对于所讨论的查询来说,这当然足够了,但我真的认为它在某种程度上被简化了,而实际条件在某种程度上比变量和表列的相等更复杂。也许是这样,但这不是问题中的场景。如果我们在代码中设置了@Gender='Female',为什么我们需要检查女性还是男性?对不起,我把我的例子简化了。但这是我真正的困境:在我的IF语句中,它选择了queryResult,但使用了不同的WHERE子句。@MarloC我在这里假设了一些简化,这就是为什么我的答案不是使用
WHERE-Gender=@Gender
条件的原因。更一般地说,如果您有类似于if(条件1)的内容,请选择。。。其中,条件2如果(条件3)选择其他,则选择。。。如果条件_4
那么它相当于选择。。。其中(条件1和条件2)或(条件3和条件4)
查询结束时不需要or语句。简单的性别=@Gender就足够了。@histia86对于所讨论的查询来说,这当然足够了,但我真的认为它在某种程度上被简化了,而实际条件在某种程度上比变量和表列的相等更复杂。也许是这样,但这不是问题中的场景。如果我们在代码中设置了@Gender='Female',为什么我们需要检查女性还是男性?对不起,我把我的例子简化了。但这是我真正的困境:在我的IF语句中,它选择了queryResult,但使用了不同的WHERE子句。@MarloC我在这里假设了一些简化,这就是为什么我的答案不是使用WHERE-Gender=@Gender
条件的原因。更一般地说,如果您有类似于if(条件1)的内容,请选择。。。其中,条件2如果(条件3)选择其他,则选择。。。如果条件_4
那么它相当于选择。。。其中(条件_1和条件_2)或(条件_3和条件_4)
对不起,我过于简化了我的示例。但这是我真正的困境:在我的IF语句中,它选择了queryResult,但使用了一个不同的WHERE子句。根据你编辑的文章,当与IF.一起使用时,查询是完全不同的。。ELSE
构造。在这种情况下,不需要CTE,只需使用IF。。我编辑了我的查询,基本上我想用一些不是声明的变量,而是我刚刚查询的表中的一列的内容进行过滤。请参见编辑的查询@Rahull我如何制作多个案例?比如时间戳>=频率为“每日”、“每月”、“每年”等时的大小写?timestamp>=频率为“每日”时的大小写,频率为“每月”时的某个列/文字值,频率为“每月”时的某个列或其他列结束时的某个列
对不起,我把我的示例简化了。但这是我真正的困境:在我的IF语句中,它选择了queryResult,但使用了一个不同的WHERE子句。根据你编辑的文章,当与IF.一起使用时,查询是完全不同的。。ELSE
构造。在这种情况下,不需要CTE,只需使用IF。。我编辑了我的查询,基本上我想用一些不是声明的变量,而是我刚刚查询的表中的一列的内容进行过滤。请参见编辑的查询@Rahull我如何制作多个案例?如时间戳>=频率为“每日”、“每月”、“每年”等时的大小写?时间戳>=频率为“每日”时的大小写,频率为“每月”时的某个列/文字值,频率为“每月”时的某个列其他某个列结尾
,CTE在这里没有任何意义,因为查询是不同的,没有较少的通用性。@Karlkienger我编辑了我的查询,基本上我想用一些不是声明的变量,而是我刚刚查询的表中的一列的内容进行筛选。请看编辑后的查询。我认为我们在简化过程中损失了很多。如前所述,您不需要IF..ELSE构造或CTE。看起来您可以使用复合WHERE子句使用CASE来实现它。@Karlkienger是的,我使用了CASE语句,结果证明这是一个更简单的查询+1对你来说,sirPer OP编辑的帖子,CTE在这里没有任何意义,因为查询是不同的,没有较少的共性。@Karlkienger我编辑了我的查询,基本上我是