none
colocar condição case, if na clausula where RRS feed

  • Pergunta

  • tenho um select que preciso de algumas forma colocar um if, case ou qualquer outra condição onde eu posso pegar a coluna correta. segue meu select

    select
    campos
    from
    tabela 
    where
    id in (11,6)
    and valor1 is not null and valor2 is not null

    o problema é o seguinte: só posso fazer a condição valor1 is not null and valor2 is not null no where quando meu id for 11, caso seja 6 não faz.

    detalhe é que o valor do meu id vem como parâmetro numa procdure da seguinte forma:

    declare
    @id varchar(100)

    isso consigo tratar colocando o select numa variável e depois mandando executar com exec(@comado). meu problema é no where mesmo... pra fazer a condição acima.

    alguma idéia?
    quinta-feira, 27 de setembro de 2012 22:15

Respostas

  • ok, não é um case ou if mas acho que desta forma tambem funcionaria, veja o que acha :

    repare que a condição "and" inteira esta entre parenteses,  então só irá trazer quando o ID for = 11 e valor 1 e 2 não forem nulos ou entao for = 6

    select
     campos
     from
     tabela 
     where 
     id in (11,6)
     and ((ID = 11 and valor1 is not null and valor2 is not null) or ID = 6)
     


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi quinta-feira, 27 de setembro de 2012 22:47
    • Marcado como Resposta rafa-martin sexta-feira, 28 de setembro de 2012 15:17
    quinta-feira, 27 de setembro de 2012 22:46

Todas as Respostas

  • Rafa, voce poderia fazer 2 selects separados, um com filtro e id = 11 e outro sem os filtros e id = 6 juntando os 2 por union:

    select
     campos
     from
     tabela 
     where id = 11
     and valor1 is not null and valor2 is not null
     
     union
     
     select
     campos
     from
     tabela 
     where id = 6
     


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 27 de setembro de 2012 22:28
  • na verdade eu já faço isso. porque queria fazer de alguma forma ou da forma que falei?

    porque existem outros códigos que possuem condições no where diferentes. E tenho centenas de código.

    Aí seguinte sua linha eu teria centenas de select's com union.

    Entendeu?

    quinta-feira, 27 de setembro de 2012 22:34
  • ok, não é um case ou if mas acho que desta forma tambem funcionaria, veja o que acha :

    repare que a condição "and" inteira esta entre parenteses,  então só irá trazer quando o ID for = 11 e valor 1 e 2 não forem nulos ou entao for = 6

    select
     campos
     from
     tabela 
     where 
     id in (11,6)
     and ((ID = 11 and valor1 is not null and valor2 is not null) or ID = 6)
     


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi quinta-feira, 27 de setembro de 2012 22:47
    • Marcado como Resposta rafa-martin sexta-feira, 28 de setembro de 2012 15:17
    quinta-feira, 27 de setembro de 2012 22:46
  • preciso aplicar algumas regras especificas so pra o id 11. então fiz o select abaixo:

    select
     campos

    from
     tabela
     where
     id in (11,6)
      and id_m in (2,3,4)
      and id_c in (0,1211)
    AND (
      (
       ID = 11 and valor1 is not null and valor2 is not null and id_c = 0 and id_m = 4
       or ID = 11 and valor1 is null and valor2 = 0 and id_c = 1211  and id_m = 4
       or ID = 11 and valor1 is not null and valor2 <> 0 and id_c = 1211 and id_m = 3
      )
      or A.ID_SUBPRODUTO = 6
     )

     

    traduzindo:

    só posso aplicar a regra valor1 is not null and valor2 is not null se meu id_c = 0 e id_m = 4
    só posso aplicar a regra valor1 is null and valor2 = 0 se meu id_c = 1211 e id_m = 4
    só passo aplicar a regra valor1 is not null and valor2 <> 0 se meu id_c = 1211 e id_m = 3

    to vendo aqui pelo resultado que parece estar ok. queria só confirmar com vc se é isso mesmo. se a cada id que tiver uma regra, eu tenho q fazer assim.

    é isso mesmo?

    quinta-feira, 27 de setembro de 2012 23:33
  • só que preciso fazer uma outra condição apenas para o id 6. como seria? assim?

    select
    campos
    from tabela where
    id
    in (11,6)
    and (

    (ID = 11 and valor1 is not null and valor2 is not null

    and id = 6 and valor2 = 0

    ) or ID = 8

    )

    ou assim?

    select
    campos
    from tabela where
    id
    in (11,6)
    and (

    (ID = 11 and valor1 is not null and valor2 is not null

    )

    and (id = 6 and valor2 = 0)

    or ID = 8

    )

    quinta-feira, 27 de setembro de 2012 23:51
  • Bom dia,

    Tente algo assim:

    select
        *
    from
        tabela
    where
        (
            id = 6 and
            id2 = 4 and
            id3 = 8
         ) or
         (
            id = 11 and
            id2 = 0 and
            id3 = 90
         ) or (...)

    Mas pode ficar bastante custoso a consulta. No final dependendo, sp_executesql poderia te ajudar.

    sexta-feira, 28 de setembro de 2012 11:21