SQL Server中有条件的WHERE子句

我正在创build一个SQL查询,我需要一个条件where子句。

它应该是这样的:

 SELECT DateAppr, TimeAppr, TAT, LaserLTR, Permit, LtrPrinter, JobName, JobNumber, JobDesc, ActQty, (ActQty-LtrPrinted) AS L, (ActQty-QtyInserted) AS M, ((ActQty-LtrPrinted)-(ActQty-QtyInserted)) AS N FROM [test].[dbo].[MM] WHERE DateDropped = 0 --This is where i need the conditional clause AND CASE WHEN @JobsOnHold = 1 THEN DateAppr >= 0 ELSE DateAppr != 0 END 

上述查询不起作用。 这是不是正确的语法,还是有另一种方法来做到这一点,我不知道?

我不想使用dynamicSQL,所以有没有其他方式,或者我必须使用一种解决方法,如使用if else和使用不同的where子句相同的查询?

尝试这个

 SELECT DateAppr, TimeAppr, TAT, LaserLTR, Permit, LtrPrinter, JobName, JobNumber, JobDesc, ActQty, (ActQty-LtrPrinted) AS L, (ActQty-QtyInserted) AS M, ((ActQty-LtrPrinted)-(ActQty-QtyInserted)) AS N FROM [test].[dbo].[MM] WHERE DateDropped = 0 AND ( (ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0) OR (ISNULL(@JobsOnHold, 0) != 1 AND DateAppr != 0) ) 

你可以在这里阅读更多有关条件的地方。

试试这个 –

 WHERE DateDropped = 0 AND ( (ISNULL(@JobsOnHold, 0) = 1 AND DateAppr >= 0) OR (ISNULL(@JobsOnHold, 0) != 1 AND DateAppr != 0) ) 

您的查询的问题是在CASEexpression式中, THENELSE部分必须具有一个expression式,其值是一个数字,一个varchar或任何其他数据types,而不是一个布尔值。

你只需要使用布尔逻辑(或者SQL使用的三元逻辑)并重写它:

 WHERE DateDropped = 0 AND ( @JobsOnHold = 1 AND DateAppr >= 0 OR (@JobsOnHold <> 1 OR @JobsOnHold IS NULL) AND DateAppr <> 0 ) 

回答如何在WHERE子句中使用CASEexpression式的基本问题:

首先记住一个CASEexpression式的值必须有一个正常的数据types值,而不是一个布尔值。 它必须是一个varchar,或者一个int,或者其他东西。 这是同样的原因,你不能说SELECT Name, 76 = Age FROM [...]并期望在结果集中得到'Frank', FALSE

另外,WHERE子句中的所有expression式都需要有一个布尔值。 它们不能具有varchar或int的值。 你不能说WHERE Name; 或在WHERE 'Frank'; 。 你必须使用比较运算符来使它成为布尔expression式,所以WHERE Name = 'Frank';

这意味着CASEexpression式必须位于布尔expression式的一边。 你必须比较CASEexpression式。 它不能靠自己!

这里:

 WHERE DateDropped = 0 AND CASE WHEN @JobsOnHold = 1 AND DateAppr >= 0 THEN 'True' WHEN DateAppr != 0 THEN 'True' ELSE 'False' END = 'True' 

注意到最后左边的CASEexpression式将把布尔expression式转换为'True' = 'True''False' = 'True'

请注意, 'False''True'没有什么特别之处。 如果你愿意,也可以使用01

通常可以将CASEexpression式重写为我们更熟悉的布尔expression式,这通常对性能更好。 但是,使用现有expression式比使用逻辑转换更容易或更易维护。