Utiliser CASE dans la clause WHERE – Paramètres de données Sql Server

J'essaye de vérifier l'exemple, si la date est nulle choisissez une date d'un autre champ. Ci-dessous la requête:

SELECT * FROM OrderPublish OP INNER JOIN Advertising AD ON AD.IdOrderPublish = OP.IdOrderPublish INNER JOIN Client Cli ON Cli.IdClient = OP.IdClient LEFT JOIN AdvertisingInserted AII ON AD.IdAdvertisingInserted = AII.IdAdvertisingInserted LEFT JOIN TypeProduct TP ON AII.IdTypeProduct = TP.IdTypeProduct INNER JOIN Publication PUB ON PUB.IdAdvertisingInserted = AII.IdAdvertisingInserted WHERE TP.IdTypeProduct in (5,7) AND CASE WHEN PUB.DtIni IS NULL THEN OP.DtInc >= Isnull('08/18/2013', OP.DtInc) ELSE PUB.DtIni >= Isnull('08/18/2013', PUB.DtIni) END AND CASE PUB.DtFinal WHEN NULL THEN OP.DtInc <= Isnull('08/23/2013', OP.DtInc) ELSE PUB.DtFinal <= Isnull('08/23/2013', PUB.DtFinal) END 

Vous pouvez le faire avec COALESCE() dans votre cas, mais si vous voulez utiliser CASE dans les critères WHERE , vous pouvez le faire. Déplacez les critères correspondants en dehors de l'instruction CASE , vous avez besoin de l'instruction CASE pour renvoyer les valeurs à comparer, pas la comparaison elle-même. Cela nécessite de doubler chaque instruction CASE :

 SELECT * FROM OrderPublish OP INNER JOIN Advertising AD ON AD.IdOrderPublish = OP.IdOrderPublish INNER JOIN Client Cli ON Cli.IdClient = OP.IdClient LEFT JOIN AdvertisingInserted AII ON AD.IdAdvertisingInserted = AII.IdAdvertisingInserted LEFT JOIN TypeProduct TP ON AII.IdTypeProduct = TP.IdTypeProduct INNER JOIN Publication PUB ON PUB.IdAdvertisingInserted = AII.IdAdvertisingInserted WHERE TP.IdTypeProduct in (5,7) AND CASE WHEN PUB.DtIni IS NULL THEN OP.DtInc ELSE PUB.DtIni END >= CASE WHEN PUB.DtIni IS NULL THEN Isnull('08/18/2013', OP.DtInc) ELSE Isnull('08/18/2013', PUB.DtIni) END AND CASE PUB.DtFinal WHEN NULL THEN OP.DtInc ELSE PUB.DtFinal END <= CASE PUB.DtFinal WHEN NULL THEN Isnull('08/23/2013', OP.DtInc) ELSE Isnull('08/23/2013', PUB.DtFinal) END 

C'est ainsi que vous pouvez utiliser une instruction CASE dans vos critères WHERE , mais vous pouvez utiliser les critères AND () et OR () avec COALESCE() pour le faire sans le CASE

En outre, vos ISNULL() sont à rebours, '08/18/2013' ISNULL() '08/18/2013' ne sera jamais NULL , donc le champ ne sera pas évalué, vous voulez probablement dire: Isnull(OP.DtInc,'08/23/2013')

Au lieu de cas, vous pouvez essayer la fonction Coalesce: http://msdn.microsoft.com/en-us/library/ms190349.aspx

 SELECT * FROM OrderPublish OP INNER JOIN Advertising AD ON AD.IdOrderPublish = OP.IdOrderPublish INNER JOIN Client Cli ON Cli.IdClient = OP.IdClient LEFT JOIN AdvertisingInserted AII ON AD.IdAdvertisingInserted = AII.IdAdvertisingInserted LEFT JOIN TypeProduct TP ON AII.IdTypeProduct = TP.IdTypeProduct INNER JOIN Publication PUB ON PUB.IdAdvertisingInserted = AII.IdAdvertisingInserted WHERE TP.IdTypeProduct in (5,7) AND Coalesce(PUB.DtIni,OP.DtInc)>= Isnull('08/18/2013', OP.DtInc) AND Coalesce(PUB.DtFinal,OP.DtInc)<= Isnull('08/23/2013', OP.DtInc)