Array
(
)

Código CASE EM SQL 2005

Huelframil
   - 17 mar 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
   - 18 mar 2008

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

CASE cur.carga_horaria
WHEN 0 THEN ´VALOR CADASTRADO INCORRETAMENTE´
ELSE convert (varchar(cur.carga_horaria)
END

uma outra maneira de solucionarmos este problema pode ser também:
CASE WHEN (cur.carga_horaria = 0)
THEN ´VALOR CADASTRADO INCORRETAMENTE´
ELSE CAST(cur.carga_horaria AS VARCHAR)
END

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