SQL - Função NULLIF


Retorna um valor nulo se as duas expressões especificadas forem iguais. Sintaxe NULLIF ( expression , expression ) Argumentos expression = É qualquer expressão escalar válida. Tipos de retorno Retorna o mesmo tipo que a primeira expression. NULLIF retornará a primeira expression se as duas expressões não forem iguais. Se as expressões forem iguais, NULLIF retornará um valor nulo do tipo da primeira expression. Comentários NULLIF é equivalente a uma expressão CASE pesquisada em que as duas expressões são iguais e a expressão resultante é NULL. É recomendável não usar funções dependentes de tempo, como RAND(), dentro de uma função NULLIF. Isto pode fazer com que a função seja avaliada duas vezes e retorne resultados diferentes nas duas invocações.

SELECT F1_FILIAL, 
           F1_TIPO,   
           F1_DOC,    
           F1_SERIE,  
           D1_DTDIGIT,
           D1_COD, 
           D1_LOCAL,
           B1_DESC,
           F1_FORNECE,
           F1_LOJA,
          (D1_CUSTO/NULLIF(D1_QUANT,0)) CUSTENT,
           B9_CM1,
           B1_UPRC,
           ((D1_CUSTO/NULLIF(D1_QUANT,0))- B9_CM1) DIFB9,
           ((D1_CUSTO/NULLIF(D1_QUANT,0))- B1_UPRC) DIFB1
 FROM   SF1010 SF1 ,SD1010 SD1, SF4010 SF4, SB9010 SB9, SB1010 SB1 
    WHERE  SF1.D_E_L_E_T_ <> '*' 
      AND  SD1.D_E_L_E_T_ <> '*' 
      AND  SF4.D_E_L_E_T_ <> '*' 
   AND  SB9.D_E_L_E_T_ <> '*' 
   AND  SB1.D_E_L_E_T_ <> '*' 
      AND  F1_FILIAL = '01' 
      AND  D1_FILIAL = '01' 
      AND  F4_FILIAL = '01' 
   AND  B9_FILIAL = '01' 
      AND  B1_FILIAL = '01' 
      AND  F1_DOC        BETWEEN '         ' AND '999999999'
      AND  F1_SERIE      BETWEEN '   ' AND 'ZZZ'
      AND  F1_FORNECE    BETWEEN '      ' AND 'ZZZZZZ'
   AND  F1_LOJA       BETWEEN '  ' AND 'ZZ'
   AND  F1_TIPO       IN ('N                                                           ') 
   AND   D1_DOC        = F1_DOC 
   AND   D1_SERIE      = F1_SERIE 
      AND   D1_DTDIGIT BETWEEN '20140101' AND '20140507'
      AND   F4_CODIGO = D1_TES
      AND   F4_ESTOQUE = 'S'
   AND   B9_COD     = D1_COD
   AND   B9_LOCAL   = D1_LOCAL
   AND   convert(datetime,B9_DATA)   = (SELECT CONVERT(DATE, dateadd(mm, datediff(mm,0, (convert(datetime, D1_DTDIGIT)-50))+1,-1)) 
                  FROM SD1010 D1 
                 WHERE D1.D1_FILIAL = SD1.D1_FILIAL 
                   AND D1.D1_DOC    = SD1.D1_DOC
                   AND D1.D1_SERIE  = SD1.D1_SERIE
                   AND D1.D1_FORNECE = SD1.D1_FORNECE
                   AND D1.D1_LOJA = SD1.D1_LOJA
                   AND D1.D1_COD    = SD1.D1_COD
                   AND D1.D1_ITEM   = SD1.D1_ITEM
                   AND D1.D_E_L_E_T_ = ' ' ) 
   AND   B1_COD = D1_COD 
 GROUP BY F1_FILIAL, 
           F1_TIPO,  
           F1_DOC,   
           F1_SERIE, 
           D1_DTDIGIT,
        D1_COD,  
        D1_LOCAL, 
        B1_DESC,  
           F1_FORNECE, 
           F1_LOJA,  
           D1_CUSTO,  
           D1_QUANT,  
        B9_CM1,   
        B1_UPRC  
     ORDER BY F1_DOC, DIFB9 DESC