none
Como preencher campos, partindo de uma condição, no Sql Server? RRS feed

  • Pergunta

  • Paz e Bem para toda a família...

    Estou procurando e querendo saber se existe um recurso que nos permite preencher um campo no SQL Server, partindo da condição de um outro campo! Exemplo:

     

    Campo1 = 2

     

    Por favor, tem como fazer: Caso Campo1 = 2 Então Campo2  = 0?

    O SQL tem um recurso que nos possibilita preencher um campo, na base da condição ou do valor existente em um outro campo da mesma tabela?

     

    Muito obrigado a todos


    • Editado Augustop sábado, 28 de janeiro de 2012 03:57
    sábado, 28 de janeiro de 2012 03:06

Respostas

  • Boa Tarde,

    Ele existe sim e é conhecido como Computed Columns.


    Ainda assim, é mais econômico que você o calcule no SELECT do que armazená-lo se o objetivo é meramente ter o valor. Até porque armazenar o resultado de um cálculo viola a 3FN e você precisaria de uma razão maior para isso, pois, é um gasto de espaço para um cálculo que poderia ser feito. Se a idéia é visualizar sem repetir o cálculo, o uso de Views seria muito bem vindo.

    Em todo caso, se quiser mesmo assim, segue um exemplo:

    create table #tmp (col1 int, col2 int, col3 as case col1 when 1 then col2 else col2 * 2 end)

    insert into #tmp (col1, col2) values (1, 0)
    insert into #tmp (col1, col2) values (1, 3)
    insert into #tmp (col1, col2) values (2, 0)
    insert into #tmp (col1, col2) values (2, 3)

    select * from #tmp

    drop table #tmp

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Augustop sábado, 28 de janeiro de 2012 22:51
    sábado, 28 de janeiro de 2012 19:59

Todas as Respostas

  • Olá, Augusto!

    Cara, não entendi muito bem sua dúvida, mas vou tentar te ajudar.

    Pelo que vi, você quer setar um determinado valor em um campo baseado em outro campo. Mostrarei 3 exemplos.

     

    Primeiro usando variáveis:

    DECLARE @Campo1 INT
    DECLARE @Campo2 INT
    
    SET @Campo1 = 2
    
    SELECT @Campo2 = CASE @Campo1
    					WHEN 2 THEN 1
    					WHEN 3 THEN 2
    					ELSE 3
    				  END
    				  
    SELECT @Campo2
    

    O valor de @Campo2 será 1.

     

    Agora, definirei o valor de uma variável me baseando em um valor de campo de uma tabela qualquer:

    --Crio a tabela e a populo com alguns valores
    CREATE TABLE tbTeste 
    	(
    		Ordem VARCHAR(10),
    		IdOrdem INT
    	)
    GO
    
    INSERT INTO tbTeste (Ordem, IdOrdem)	
    VALUES 
    ('Primeiro', 1),
    ('Segundo', 2),
    ('Terceiro', 3),
    ('Quarto', 4),
    ('Quinto', 5)
    
    DECLARE @Ordem VARCHAR(10)
    
    SELECT @Ordem = CASE IdOrdem 
    				  WHEN 1 THEN 'First'
    				  WHEN 2 THEN 'Second'
    				  WHEN 3 THEN 'Third'
    				  WHEN 4 THEN 'Fourth'
    				  WHEN 5 THEN 'Fift'
    				  ELSE 'Nenhum'
    				END
      FROM tbTeste
     WHERE Ordem = 'Segundo'
      
    SELECT @Ordem  
    


    O valor de @Ordem será Second, pois o campo IdOrdem de 'Segundo' é 2.

     

    No terceiro exemplo farei uma atualização no campo Ordem da tabela criada no exemplo acima.

    UPDATE tbTeste
    SET Ordem = CASE IdOrdem 
    			  WHEN 1 THEN 'First'
    			  WHEN 2 THEN 'Second'
    			  WHEN 3 THEN 'Third'
    			  WHEN 4 THEN 'Fourth'
    			  WHEN 5 THEN 'Fift'
    			  ELSE 'Nenhum'
    			END
      FROM tbTeste
     
     SELECT * 
      FROM tbTeste
    
    

    Esse comando atualizará o campo Ordem da tabela conforme o seu Id.

    Enfim, em todos os exemplos usei CASE.

    Era essa sua dúvida?

    • Sugerido como Resposta Philipe Souza sábado, 28 de janeiro de 2012 07:25
    • Não Sugerido como Resposta Augustop sábado, 28 de janeiro de 2012 12:08
    sábado, 28 de janeiro de 2012 06:48
  • Philipe Souza,

     

    Obrigado pela resposta.

     

    Eu pretendo que uma coluna/campo, tenha um valor atribuido automaticamente. Este valor deve ser atribuido com base em um valor que existe em um outro campo. Por exemplo:

     

    Quando eu abrir a tabela eu pretendo que o Campo/Coluna2 tenha o valor 0, CASO o Campo1 tiver o valor 2! Ou seja, o valor atribuido à Coluna2, vai depender do valor que a Coluna1 tem.

    Simulando um CASE, seria:

     

    CASE Campo1 tem o valor = 15

    Então Campo2 fica com valor  =0;

     

    Mas eu pretendo que quando eu abro a tabela, o cálculo seja feito automaticamente e que o Campo2 tenha ja o seu valor.

    Estou fuçando muito Philipe mas está difícil!!!!!!!!!

     

    MUITO OBRIGADO PELA ATENÇÃO





    • Editado Augustop sábado, 28 de janeiro de 2012 17:10
    sábado, 28 de janeiro de 2012 12:08
  • Por favor, alguém pode me dizer se o recurso que eu estou procurando existe no SQL Server?
    sábado, 28 de janeiro de 2012 17:19
  • Boa Tarde,

    Ele existe sim e é conhecido como Computed Columns.


    Ainda assim, é mais econômico que você o calcule no SELECT do que armazená-lo se o objetivo é meramente ter o valor. Até porque armazenar o resultado de um cálculo viola a 3FN e você precisaria de uma razão maior para isso, pois, é um gasto de espaço para um cálculo que poderia ser feito. Se a idéia é visualizar sem repetir o cálculo, o uso de Views seria muito bem vindo.

    Em todo caso, se quiser mesmo assim, segue um exemplo:

    create table #tmp (col1 int, col2 int, col3 as case col1 when 1 then col2 else col2 * 2 end)

    insert into #tmp (col1, col2) values (1, 0)
    insert into #tmp (col1, col2) values (1, 3)
    insert into #tmp (col1, col2) values (2, 0)
    insert into #tmp (col1, col2) values (2, 3)

    select * from #tmp

    drop table #tmp

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos: http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível
    • Marcado como Resposta Augustop sábado, 28 de janeiro de 2012 22:51
    sábado, 28 de janeiro de 2012 19:59
  • Gustavo Maia Aguiar, cara voce matou tudo! Era EXATAMENTE isso que eu estava procurando,

    Philip, valeu pela informação que também foi muito útil para mim!

    Saúde e Prosperidade,

    Abraços

    sábado, 28 de janeiro de 2012 23:02