Cláusula WHERE condicional no SQL Server

Eu estou criando uma consulta SQL em que eu preciso de uma cláusula where condicional.

Deve ser algo assim:

 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 

A consulta acima não está funcionando. Esta não é a syntax correta ou há outra maneira de fazer isso que eu não sei?

Eu não quero usar SQL dynamic, então existe alguma outra maneira ou eu tenho que usar uma solução alternativa como usar if else e usando a mesma consulta com diferentes cláusulas where ?

   

Tente isso

 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) ) 

Você pode ler mais sobre condicional onde aqui.

Tente este –

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

Para responder à questão subjacente de como usar uma expressão CASE na cláusula WHERE:

Primeiro, lembre-se de que o valor de uma expressão CASE deve ter um valor de tipo de dados normal, não um valor booleano. Tem que ser um varchar, um int ou algo assim. É a mesma razão pela qual você não pode dizer SELECT Name, 76 = Age FROM [...] e esperar obter 'Frank', FALSE no conjunto de resultados.

Além disso, todas as expressões em uma cláusula WHERE precisam ter um valor booleano. Eles não podem ter um valor de um varchar ou um int. Você não pode dizer WHERE Name; ou WHERE 'Frank'; . Você tem que usar um operador de comparação para torná-lo uma expressão booleana, então WHERE Name = 'Frank';

Isso significa que a expressão CASE deve estar em um lado de uma expressão booleana. Você tem que comparar a expressão CASE para algo. Não pode ficar sozinho!

Aqui:

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

Observe como no final a expressão CASE à esquerda irá transformar a expressão booleana em 'True' = 'True' ou 'False' = 'True' .

Note que não há nada de especial sobre 'False' e 'True' . Você pode usar 0 e 1 se preferir também.

Você pode tipicamente rewrite a expressão CASE em expressões booleanas com as quais estamos mais familiarizados, e isso geralmente é melhor para o desempenho. No entanto, às vezes é mais fácil ou mais fácil usar uma expressão existente do que converter a lógica.

O problema com sua consulta é que, nas expressões CASE , as partes THEN e ELSE devem ter uma expressão que seja avaliada para um número ou um varchar ou qualquer outro tipo de dados, mas não para um valor booleano.

Você só precisa usar a lógica booleana (ou melhor, a lógica ternária usada pelo SQL) e reescrevê-la:

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