2013-08-26 57 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)