none
Select condicional em SP RRS feed

  • Pergunta

  • Olá,

    Tenho uma Sp onde preciso alterar uma query dependendo de uma condição mas não sei como fazer...

    É algo como :

    declare @Condicao INT
    declare @Valor FLOAT

    declare @Valor = select sum(campo) from tabela
                where condicao1
              
                 if @Condicao = verdade
                    
                    begin
                      
    Aqui preciso acrescentar novas condições a minha query...

                    end
    .

    Agradeço antecipadamente qualquer ajuda

    sábado, 10 de janeiro de 2009 19:55

Respostas

  • Olá Mike,

     

    Você terá que atribuir o valor da variável após a análise da condição (e não antes):

     

    Code Snippet

    declare @Valor FLOAT

    declare @Condicao INT

     

    if @Condicao = 1

    select @Valor = sum(Campo) from tabela_de_cidades where cidade = 'São Paulo'

    else

    select @Valor = sum(Campo) from tabela_de_cidades where cidade = 'São Paulo' and bairro = 'Tatuape'

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    domingo, 11 de janeiro de 2009 13:31

Todas as Respostas

  • Olá Mike,

    segue um exemplo, espero que ajuda a clarear as suas idéias:

     

    Code Snippet

    create procedure pr_teste @condicao char(1)

    as

    declare @sentenca varchar(500)

    -- reproduz uma tabela de exemplo para o select condicional

    if exists (select 1 from tempdb..sysobjects where name like '%#teste%')

    drop table #teste

    create table #teste

    (cod int,

    nome varchar(10))

    insert into #teste values(1,'aaaa')

    insert into #teste values(2,'bbbb')

    insert into #teste values(3,'cccc')

    -- Construção da sentença condicional

    set @sentenca = 'select * from #teste where cod ='+ @condicao

    --executa a sentença

    exec (@sentenca)

    go

    -- Executa procedure de exemplo

    exec pr_teste @condicao =3

     

     

    sábado, 10 de janeiro de 2009 20:34
  • Olá Emanuel,

    Entendi seu exemplo mas não vejo como aplicá-lo a minha necessidade já que no meu caso o select é usado para inicializar uma variável...

    Obrigado
    sábado, 10 de janeiro de 2009 20:46
  • Mike, da uma olhada no exemplo a seguir e veja se essa lógica te ajuda:

     

    Code Snippet

    Create procedure pr_teste @condicao1 char(1) = null,@condicao2 varchar(10) = null ,@condicao3 varchar(20)= null

    as

    SET CONCAT_NULL_YIELDS_NULL OFF

    declare @sentenca varchar(500),@condicao_sentenca varchar(100)

    -- reproduz uma tabela de exemplo para o select condicional

    if exists (select 1 from tempdb..sysobjects where name like '%#teste%')

    drop table #teste

    create table #teste

    (cod int,

    nome varchar(10),

    stat char(1))

    insert into #teste values(1,'aaaa','F')

    insert into #teste values(2,'bbbb','F')

    insert into #teste values(3,'cccc','V')

    IF @condicao1 is not null

    set @condicao_sentenca = ' and cod =' + @condicao1

    IF @condicao2 is not null

    set @condicao_sentenca = @condicao_sentenca + ' and nome =' +''''+ @condicao2+''''

    IF @condicao3 is not null

    set @condicao_sentenca = @condicao_sentenca + ' and stat =' +''''+ @condicao3+''''

    -- Construção da sentenção com parametros

    set @sentenca = 'select * from #teste where cod is not null '+ @condicao_sentenca

    --executa a sentença

    select (@sentenca)

    EXEC (@sentenca)

    go

    -- Executa procedure de exemplo

    --Todas as Condições

    exec pr_teste @condicao1 =1,@condicao2 ='aaaa',@condicao3 = 'F'

    -- utilização partial de parametros

    exec pr_teste @condicao1 =3

    exec pr_teste @condicao2 ='bbbb'

    exec pr_teste @condicao2 ='aaaa',@condicao3 = 'F'

     

     

    sábado, 10 de janeiro de 2009 21:14
  • Olá Emanuel,

    Não estou entendendo como usar seu exemplo para jogar diretamente um valor em uma variável que é o que eu preciso...

    Exemplo :

    declare @Variavel INT

    select @variavel = sum() from tabela_de_cidades where cidade = 'São Paulo'
    ========================================================

    Imagine que por exemplo, eu posso querer jogar o Bairro como condição dependendo de um fator qualquer...neste caso eu preciso de algo como

    declare @Variavel INT

    select @variavel = sum() from tabela_de_cidades where cidade = 'São Paulo'
    if @Condicao then
       begin
           AQUI PRECISO COMPLEMENTAR A QUERY E É ISTO QUE NÃO CONSIGO...
       end

    A query final ficaria ....

    select @variavel = sum() from tabela_de_cidades where cidade = 'São Paulo'  and bairro = 'Tatuape'


    Obrigado
    sábado, 10 de janeiro de 2009 23:58
  • Olá Mike,

     

    Você terá que atribuir o valor da variável após a análise da condição (e não antes):

     

    Code Snippet

    declare @Valor FLOAT

    declare @Condicao INT

     

    if @Condicao = 1

    select @Valor = sum(Campo) from tabela_de_cidades where cidade = 'São Paulo'

    else

    select @Valor = sum(Campo) from tabela_de_cidades where cidade = 'São Paulo' and bairro = 'Tatuape'

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    domingo, 11 de janeiro de 2009 13:31
  • Olá Gustavo,

     

    Pois é...eu queria ver se se de alguma maneira eu evitava ter que usar duas querys usando uma ou outra dependendo da condição como voce exemplificou.

     

    Gostaria de usar uma query única modelando a mesma na sequência do código mas estou vendo que não há como mesmo não é ?

     

    Obrigado

    domingo, 11 de janeiro de 2009 15:15
  • Olá Mike_Kla,

     

    Infelizmente isso só é possível fazer se for através de uma SQL dinâmica. Ex:

     

    Code Snippet

    declare @cmdSQL VARCHAR(1000)

    declare @valor int

    declare @condicao int

     

    set @cmdSQL = 'SELECT <Campos> FROM <Tabelas>'

     

    if @condicao = 1

    set @cmdSQL = @cmdSQL + ' WHERE <OutrosCriterios>'

     

    exec (@cmdSQL)

     

    O problema é que sql dinâmicas tem alguns inconvenientes e se você quiser capturar o retorno será um pouco mais trabalhoso. Outra opção é montar a instrução na aplicação e enviar diretamente ao banco de dados se desejar.

     

    [ ]s,

     

    Gustavo Maia Aguiar

    http://gustavomaiaaguiar.spaces.live.com

    domingo, 11 de janeiro de 2009 19:02