Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用IF条件过滤选择结果?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何使用IF条件过滤选择结果?

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+

我有一个返回所有员工的SQL查询。它给我一个错误,因为它期望在
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我编辑了我的查询,基本上我是