none
Pode acontecer de uma condição de um CASE ser válido para 2 situações? RRS feed

  • Pergunta

  • Tenho a seguinte instrução:

    Gostaria que alguém tentasse me ajudar para verificar a Sintaxe se está correta.
    O que acontece é que tenho uma situação onde a condição foi válida, porém está passando direto e caindo no ultimo ELSE.

    ISNULL( CASE WHEN SEQ.CODVIAGEM = 1 THEN '0'
    --A VIAGEM 2 SÓ É ALTERADA QUANDO A PRIMEIRA VIAGEM CHEGA ATRASADA
    --DO CONTRÁRIO OS CRITÉRIOS PARA O CÁLCULO DE FILA E AUSÊNCIA SÃO 
    --OS MESMOS.
    --VERIFICA SE HOUVE ATRASO NA PRIMEIRA VIAGEM DA PROGRAMAÇÃO
    WHEN SEQ.CODVIAGEM = 2 AND  (SELECT DATEDIFF(MI,MIN(IP.HORCHEGADAOBRA), MIN(NF.HORCHEGADAOBRA)) FROM NOTAFISCAL NF
    INNER JOIN ITEMPROGRAMACAO IP ON IP.CODPROGVIAGEM = NF.CODPROGVIAGEM
    WHERE NF.CODPROGRAMACAO = ISNULL(@CODPROGRAMACAO, N.CODPROGRAMACAO)
    AND IP.CODPROGVIAGEM < NF.CODPROGVIAGEM) <= 0
    THEN  
    CASE
    --ADIANTADO EM RELAÇÃO A HORA PROGRAMADA 
    WHEN N.HORCHEGADAOBRA <= IP.HORCHEGADAOBRA
    THEN 
    CASE 
    --CASO O CAMINHÃO CHEGUE APÓS O FIM DA DESCARGA ANTERIOR
    WHEN N.HORCHEGADAOBRA >= (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
         WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
         AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
         ORDER BY NF.HORINIDESCARGA DESC)
    THEN '0'
    --CASO O CAMINHÃO CHEGA ANTES DO FIM DA DESCARGA ANTERIOR
    --E COMECE A DESCARREGAR APÓS O FIM DA DESCARGA ANTERIOR
    WHEN N.HORCHEGADAOBRA < (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
    AND N.HORINIDESCARGA >= (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)      
    THEN DATEDIFF(MI,(SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
     WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
    WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
    AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
    AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
    ORDER BY NF.HORINIDESCARGA DESC), N.HORCHEGADAOBRA)
    --CASO O CAMINHÃO CHEGUE ANTES DO FIM DA DESCARGA ANTERIOR
       --E COMECE A DESCARREGAR ANTES DO FIM DA DECASRGA ANTERIOR,
       --ENTÃO HAVARÁ DESCARGA SIMULTÂNEA
       WHEN N.HORCHEGADAOBRA <  (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
     
          AND N.HORINIDESCARGA < (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
       THEN DATEDIFF(MI, N.HORINIDESCARGA, N.HORCHEGADAOBRA)  
    END  

    --ATRASADO EM RELAÇÃO AO HORÁRIO PROGRAMADO
    ELSE 
     DATEDIFF(MI,(SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC), N.HORCHEGADAOBRA)
    END
     
     
       --CASO A BT CHEGUE ADIANTADA EM RELAÇÃO A HORA AJUSTADA. 
       WHEN N.HORCHEGADAOBRA <= dbo.ufcIntervaloAjustado(N.CODPROGRAMACAO, N.NUMNOTAFISCAL)
       THEN 
     --CASO O CAMINHÃO CHEGUE DEPOIS DO FIM DA DESCARGA ANTERIOR
     --ENTÃO NÃO HAVERÁ FILA E NEM AUSÊNCIA.
    CASE WHEN N.HORCHEGADAOBRA >= (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
       THEN '0'
    --CASO O CAMINHÃO CHEGUE ANTES DO FIM DA DESCARGA ANTERIOR
    --E SÓ COMECE A DESCARREGAR APÓS O FIM DA DESCARGA ANTERIOR
    --ENTÃO HAVERÁ FILA.
       WHEN N.HORCHEGADAOBRA <  (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
     
          AND N.HORINIDESCARGA >= (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)    
       THEN    
    DATEDIFF(MI,(SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC), N.HORCHEGADAOBRA)
             
       --CASO O CAMINHÃO CHEGUE ANTES DO FIM DA DESCARGA ANTERIOR
       --E COMECE A DESCARREGAR ANTES DO FIM DA DECASRGA ANTERIOR,
       --ENTÃO HAVARÁ DESCARGA SIMULTÂNEA

             
       WHEN N.HORCHEGADAOBRA <  (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
     
          AND N.HORINIDESCARGA < (SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC)
       THEN  DATEDIFF(MI, N.HORINIDESCARGA, N.HORCHEGADAOBRA)
                 
    END
        --CASO O CAMINHÃO CHEGUE ATRASADO EM RELAÇÃO A HORA AJUSTADA
    ELSE
    --SE A DESCARGA ANTERIOR JÁ ACABOU, AUSÊNCIA SERÁ O MENOR VALOR 
    --OBTIDO ENTRE (FIM DESCARGA ANTERIOR ATÉ CHEGADA BT) E
    --(HORÁRIO PROGRAMADO AJUSTADO E CHEGADA BT)
    CASE WHEN DATEDIFF(MI,(SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC), N.HORCHEGADAOBRA) <
           DATEDIFF(MI, dbo.ufcIntervaloAjustado(N.CODPROGRAMACAO, N.NUMNOTAFISCAL), N.HORCHEGADAOBRA)
           
          THEN DATEDIFF(MI,(SELECT TOP(1) NF.HORFIMDESCARGA FROM NOTAFISCAL NF
      WHERE NF.HORINIDESCARGA < (SELECT TOP 1 NF.HORINIDESCARGA FROM NOTAFISCAL NF
     WHERE  NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     AND    NF.NUMNOTAFISCAL = N.NUMNOTAFISCAL)
     AND NF.CODPROGRAMACAO = N.CODPROGRAMACAO
     ORDER BY NF.HORINIDESCARGA DESC), N.HORCHEGADAOBRA)
    ELSE
    DATEDIFF(MI, dbo.ufcIntervaloAjustado(N.CODPROGRAMACAO, N.NUMNOTAFISCAL), N.HORCHEGADAOBRA)

    END      

     END,0)

    sexta-feira, 15 de fevereiro de 2013 20:00

Respostas

  • Daniel,

    Sim, todo caso a primeira é a que será efetivamente executada. Segue script de exemplo:

    SELECT
    CASE
    WHEN 1=1 THEN 'A'
    WHEN 2=2 THEN 'B'
    END


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:42
    sábado, 16 de fevereiro de 2013 11:07
    Moderador
  • Daniel,

    Por se tratar de um comando lógico condicional, o SQL Server vai realizar a análise de cada condição partindo da primeira, caso ela já seja satisfatória será processada, como também as demais.

    Então neste caso, você terá que entender e definir as regras que realmente devem ser analisadas e atendidas.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:42
    sábado, 16 de fevereiro de 2013 12:09

Todas as Respostas

  • Daniel,

    Sim, todo caso a primeira é a que será efetivamente executada. Segue script de exemplo:

    SELECT
    CASE
    WHEN 1=1 THEN 'A'
    WHEN 2=2 THEN 'B'
    END


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    ITIL V3 Foundation
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:42
    sábado, 16 de fevereiro de 2013 11:07
    Moderador
  • Daniel,

    Por se tratar de um comando lógico condicional, o SQL Server vai realizar a análise de cada condição partindo da primeira, caso ela já seja satisfatória será processada, como também as demais.

    Então neste caso, você terá que entender e definir as regras que realmente devem ser analisadas e atendidas.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Ricardo Russo segunda-feira, 18 de fevereiro de 2013 12:42
    sábado, 16 de fevereiro de 2013 12:09