2013-08-26 37 views
3

我想验证示例,如果日期为null,则从另一个字段中选择一个日期。下面的查询:在WHERE子句中使用CASE - 数据参数Sql Server

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 
+0

亲爱的,如果AII为空(LEFT OUTER JOIN失败)当您使用INNER同一AII表时,你失去了你的行。你确定? –

回答

4

你可以在你的情况与COALESCE()做到这一点,但如果你想使用CASEWHERE标准,你可以这样做。移动CASE语句之外的匹配条件,您需要CASE语句返回要比较的值,而不是比较本身。这需要增加了一倍每个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  

这就是你可以在你的WHERE标准使用CASE语句,但你可以使用AND()OR()标准与COALESCE()一起做这个而不CASE

而且,您的ISNULL()陈述是向后,'08/18/2013'将永远不会NULL,所以该字段将不会被评估,您可能的意思是:Isnull(OP.DtInc,'08/23/2013')

2

相反情况下,你可以尝试合并功能: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)