Usuário com melhor resposta
Pode acontecer de uma condição de um CASE ser válido para 2 situações?

Pergunta
-
Tenho a seguinte instrução:
Gostaria que alguém tentasse me ajudar para verificar a Sintaxe se está correta.
ISNULL( CASE WHEN SEQ.CODVIAGEM = 1 THEN '0'
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.
--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)
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'
ENDFabrizzio 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
-
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
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'
ENDFabrizzio 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
-
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