Código CASE EM SQL 2005

17/03/2008

:? Olá pessoal, fiz o seguinte código que está funcional, mas gostaria de melhorá-lo. É o seguinte tenho um valor de carga horária que é int e quando no banco ela for cadastrada como 0 aparecerá a mensagem: Valor Cadastrado Incorretamente, se não for 0, aparecerá o valor que está cadastrado no banco.
A solução ue eu encontrei foi:

DECLARE @mensagem VARCHAR(255)
DECLARE @cd_aluno INT

SET @mensagem = ´´
SET @cd_aluno = codigodoaluno

SELECT @mensagem = @mensagem + (
CASE @mensagem
WHEN ´´ THEN ´´ ELSE ´´
END
) +
(
CASE cur.carga_horaria
WHEN 0 THEN ´VALOR CADASTRADO INCORRETAMENTE´
WHEN 10 THEN ´10´
WHEN 16 THEN ´16´
WHEN 30 THEN ´30´
WHEN 32 THEN ´32´
WHEN 38 THEN ´38´
WHEN 45 THEN ´45´
WHEN 60 THEN ´60´
WHEN 80 THEN ´80´
WHEN 90 THEN ´90´
WHEN 100 THEN ´100´
WHEN 105 THEN ´105´
WHEN 150 THEN ´150´
WHEN 180 THEN ´180´
WHEN 225 THEN ´225´
WHEN 360 THEN ´360´
WHEN 375 THEN ´375´
WHEN 390 THEN ´390´
WHEN 400 THEN ´400´
WHEN 405 THEN ´405´
WHEN 418 THEN ´418´
WHEN 420 THEN ´420´
WHEN 450 THEN ´450´
WHEN 480 THEN ´480´
WHEN 495 THEN ´495´
WHEN 540 THEN ´540´
WHEN 550 THEN ´550´
WHEN 600 THEN ´600´
WHEN 615 THEN ´615´
WHEN 1728 THEN ´1728´
WHEN 1920 THEN ´1920´
WHEN 2000 THEN ´2000´
WHEN 2412 THEN ´2412´
WHEN 2420 THEN ´2420´
WHEN 2628 THEN ´2628´
WHEN 2800 THEN ´2800´
WHEN 2824 THEN ´2824´
WHEN 3020 THEN ´3020´
WHEN 3098 THEN ´3098´
WHEN 3120 THEN ´3120´
WHEN 3190 THEN ´3190´
WHEN 3212 THEN ´3212´
WHEN 3224 THEN ´3224´
WHEN 3260 THEN ´3260´
WHEN 3292 THEN ´3292´
WHEN 3300 THEN ´3300´
WHEN 3672 THEN ´3672´
WHEN 4050 THEN ´4050´
WHEN 9999 THEN ´9999´
END
)

FROM D5ECurso cur
INNER JOIN D5ETurma t ON t.cd_curso = cur.cd_curso
INNER JOIN D5EAluno a ON a.cd_turma = t.cd_turma
WHERE a.cd_aluno = codigodoaluno

Como posso melhorar este código?
Agradeço desde já a ajuda.


Huelframil

Respostas

18/03/2008

Huelframil

:P Recebi uma orientação do Professor Agnaldo Diogo dos Santos (possui artigos na SQL Magazine), que me sugeriu a seguinte solução:

[color=blue:3e3d13faf4]CASE[/color:3e3d13faf4] cur.carga_horaria
[color=blue:3e3d13faf4]WHEN[/color:3e3d13faf4] 0 [color=blue:3e3d13faf4]THEN[/color:3e3d13faf4] [color=red:3e3d13faf4]´VALOR CADASTRADO INCORRETAMENTE´ [/color:3e3d13faf4]
[color=blue:3e3d13faf4]ELSE[/color:3e3d13faf4] [color=violet:3e3d13faf4]convert[/color:3e3d13faf4] ([color=blue:3e3d13faf4]varchar[/color:3e3d13faf4](cur.carga_horaria)
[color=blue:3e3d13faf4]END[/color:3e3d13faf4]

uma outra maneira de solucionarmos este problema pode ser também:
[color=blue:3e3d13faf4]CASE WHEN [/color:3e3d13faf4](cur.carga_horaria = 0)
[color=blue:3e3d13faf4]THEN[/color:3e3d13faf4] [color=red:3e3d13faf4]´VALOR CADASTRADO INCORRETAMENTE´ [/color:3e3d13faf4]
[color=blue:3e3d13faf4]ELSE [/color:3e3d13faf4][color=violet:3e3d13faf4]CAST[/color:3e3d13faf4](cur.carga_horaria [color=blue:3e3d13faf4]AS VARCHAR[/color:3e3d13faf4])
[color=blue:3e3d13faf4]END[/color:3e3d13faf4]

Por precaução, para sanarmos também o problema de existirem valores NULOS, é:
[color=blue:3e3d13faf4]CASE[/color:3e3d13faf4] cur.carga_horaria
[color=blue:3e3d13faf4]WHEN[/color:3e3d13faf4] 0 [color=blue:3e3d13faf4]THEN[/color:3e3d13faf4] [color=red:3e3d13faf4]´VALOR CADASTRADO INCORRETAMENTE´ [/color:3e3d13faf4]
[color=blue:3e3d13faf4]ELSE [/color:3e3d13faf4][color=violet:3e3d13faf4]convert[/color:3e3d13faf4] ( [color=blue:3e3d13faf4]varchar[/color:3e3d13faf4],([color=violet:3e3d13faf4]COALESCE[/color:3e3d13faf4] (cur.carga_horaria, [color=red:3e3d13faf4]´NÃO INFORMADO NO CADASTRO´[/color:3e3d13faf4])))
[color=blue:3e3d13faf4]END[/color:3e3d13faf4]


Responder Citar