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) )
您的查询的问题是在CASE
expression式中, THEN
和ELSE
部分必须具有一个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'
没有什么特别之处。 如果你愿意,也可以使用0
和1
。
通常可以将CASEexpression式重写为我们更熟悉的布尔expression式,这通常对性能更好。 但是,使用现有expression式比使用逻辑转换更容易或更易维护。