none
Como relacionar dados de um campo formado por uma expressão CASE? RRS feed

  • Pergunta

  • Boa tarde,

    Estou com uma dificuldade em montar uma sentença SQL que envolve três tabelas pois um dos campos a ser relacionado é na verdade uma expressão CASE e não um campo comum da base.

    As tabelas são: uhistorico (todas as disciplinas cursadas pelo aluno), uequivdisc (disciplina equivalente) e ugrade (grade curricular do aluno).

    No Select abaixo, consigo obter o "cod_disciplina" através do case. Agora preciso relacionar esse "cod_disciplina" com a tabela ugrade (para saber quais disciplinas o aluno cursou e quais ele precisa cursar, ou seja, preciso relacionar com o Left Join.

    O problema é que por ser uma expressão, não consigo fazer o relacionamento do cod_disciplina com a ugrade.codmat. Como posso fazer esse relacionamento?

    select distinct
    a.perletivo, a.mataluno, a.codcur, a.codper, a.grade, a.codmat, a.status, a.cargahoraria, b.codmateq,
    case when b.codmateq is null then a.codmat else b.codmateq end as cod_disciplina

    from uhistorico a left join uequivdisc b on a.codcur = b.codcureq and a.codper = b.codpereq and a.grade = b.gradeeq and a.codmat = b.codmat
    where mataluno = 3112999

    Se puderem me ajudar, agradeço imensamente.

    segunda-feira, 4 de junho de 2012 20:24

Respostas

  • Boa tarde Dilson,

    Você usar essa mesma expressão case no seu inner/left join com a ugrade.

    Ex:

    .......

    LEFT join ugrade u

    on u.cdmat = (case when b.codmateq is null then a.codmat else b.codmateq end)

    At.
    Rafael

    • Marcado como Resposta Heloisa Pires sexta-feira, 8 de junho de 2012 14:18
    segunda-feira, 4 de junho de 2012 20:45

Todas as Respostas

  • Boa tarde Dilson,

    Você usar essa mesma expressão case no seu inner/left join com a ugrade.

    Ex:

    .......

    LEFT join ugrade u

    on u.cdmat = (case when b.codmateq is null then a.codmat else b.codmateq end)

    At.
    Rafael

    • Marcado como Resposta Heloisa Pires sexta-feira, 8 de junho de 2012 14:18
    segunda-feira, 4 de junho de 2012 20:45
  • Sem problemas dilson,

    podes comparar normalmente como o Rafael disse, mas nesse caso podes usar o ISNULL/COALESCE para tratar o campo no lugar do CASE.

    Pode usar:

    ISNULL(b.codmateq, a.codmat) 

    ou

    COALESCE(b.codmateq, a.codmat)

    Boa Sorte.


    Antero Marques

    • Sugerido como Resposta Rafael S. Melo terça-feira, 5 de junho de 2012 16:42
    terça-feira, 5 de junho de 2012 10:59
  • Exatamente Antero,

    Coloquei o exemplo usando o case para exemplificar que é possível usar o case no where/join...

    Sua dica, na situação dele é a mais aceitável.

    At.
    Rafael Melo

    terça-feira, 5 de junho de 2012 16:42
  • Olá Rafael, boa tarde!

    Fiz conforme você sugeriu relacionando com a ugrade.codmat com o case... e deu certo! Tentei da forma explicada pelo Antero mas não compreendi muito bem aonde coloco a instrução ISNULL ou  COALESCE.

    Agradeço muito a colaboração de vocês.

    Att.,

    Dilson

    terça-feira, 5 de junho de 2012 20:51
  • Que bom que deu certo dilson, então marque a resposta do Rafael, por favor.

    Explicando: 

    você substitui o

    "case when b.codmateq is null then a.codmat else b.codmateq end as cod_disciplina"

    por

    ISNULL(b.codmateq, a.codmat) as cod_disciplina

    e

    u.cdmat = (case when b.codmateq is null then a.codmat else b.codmateq end)

    por

    u.cdmat = ISNULL(b.codmateq, a.codmat)


    Antero Marques

    terça-feira, 5 de junho de 2012 21:00