none
Select para trazer UF RRS feed

  • Pergunta

  • Amigos,

    Preciso criar um select em meu trabalho nas seguintes condições, tenho uma tabela onde possuo o numero de telefone dos clientes, com o DDD de cada cliente preciso montar um visão que me traga o Estado de cada um, ou seja, se for 21 me traga no select RJ, se for 11 me traga SP meio por ai.Pensei na função left e depois um IF, mas não funcionou.Alguem pode me ajusdar.

    terça-feira, 28 de fevereiro de 2012 15:01

Respostas

  • Boa tarde!

       Então seria assim, usando left(coluna,quantidade) para pegar os 2 primeiros digitos e usando o between para verificar se o valor está entre dois valores:
    SELECT  
      telefone
     ,uf=(CASE WHEN left(telefone,2) between 11 and 19 THEN 'SP' ELSE 
    	  CASE WHEN left(telefone,2) between 21 and 23 THEN 'RJ' ELSE
    		 CASE WHEN left(telefone,2) between 41 and 45 THEN 'PR'  
    		 END
    	  END
         END)
    from [tabela]


     Espero ter lhe ajudado!! Se lhe ajudou, marque como resposta e ajude os outros usuários!

     Obrigado!!

    Thiago Rogerio
    www.thiagorogerio.com.br
    thiagorogeriobr@hotmail.com

    • Marcado como Resposta Leandro_19 quarta-feira, 29 de fevereiro de 2012 14:10
    terça-feira, 28 de fevereiro de 2012 18:03

Todas as Respostas

  •  Boa tarde!!

         Segue uma sugestão usando CASE WHEN END:

    CREATE VIEW view_TelefoneEstado
    AS
    SELECT
     ddd,telefone,
     uf=(CASE WHEN ddd=11 THEN 'SP' ELSE 
    	  CASE WHEN ddd=21 THEN 'RJ' ELSE
    		 CASE WHEN ddd=14 THEN 'SP' 
    		 END
    	  END
         END)
    from [tabela]

     **Dessa forma vai dar um trabalho grande, pois um estado tem vários DDD's....


     Espero ter lhe ajudado!! Se lhe ajudou, marque como resposta! Obrigado!!

    Thiago Rogerio
    www.thiagorogerio.com.br
    thiagorogeriobr@hotmail.com

    terça-feira, 28 de fevereiro de 2012 15:11
  •   

    Boa tarde!!

       Segue outra sugestão.

    1) Criar uma tabela que irá relacionar DDD x ESTADO:

    CREATE TABLE [tabela_telefone_estado]
    (
       ddd int not null
      ,estado char(2) not null
    )
    
     



    2) Inserir os dados na tabela:

    INSERT INTO [tabela_telefone_estado] VALUES (11,'SP')
    INSERT INTO [tabela_telefone_estado] VALUES (12,'SP')
    INSERT INTO [tabela_telefone_estado] VALUES (13,'SP')
    INSERT INTO [tabela_telefone_estado] VALUES (14,'SP')
    INSERT INTO [tabela_telefone_estado] VALUES (15,'SP')
    INSERT INTO [tabela_telefone_estado] VALUES (21,'RJ')
    INSERT INTO [tabela_telefone_estado] VALUES (41,'PR')
     


    3) Agora o seu select fará um join com a tabela criada:

    SELECT
      a.ddd,a.telefone
     ,b.estado
    from [tabela_de_telefones] a INNER JOIN [tabela_telefone_estado] b ON (a.ddd=b.ddd)

     Espero ter lhe ajudado!! Se lhe ajudou, marque como resposta e ajude os outros usuários! Obrigado!!


    Thiago Rogerio
    www.thiagorogerio.com.br
    thiagorogeriobr@hotmail.com

    terça-feira, 28 de fevereiro de 2012 15:17
  • Thiago, obrigado pela sugestão irei testar, minha tabela é muito grande acredito que um Join irá levar um certo tempo para execução vou testar as duas formas e ver qual leva menos tempo.
    terça-feira, 28 de fevereiro de 2012 15:21
  • Ok!!
     
       **marque como resposta, para que o status dessa thread mude para respondido! Obrigado!

    Thiago Rogerio
    www.thiagorogerio.com.br
    thiagorogeriobr@hotmail.com

    terça-feira, 28 de fevereiro de 2012 15:40
  • Thiago no 1º caso, eu tenho um campo da tabela com os numeros no seguinte formato 2112345678, o exemplo que citou me refiro ao 1° retornou nulo.Pensei em, como são muitos DDD's, talvez em ler o primeiro digito e dizer o estado, um exemplo seria SP que a variação de ddd vai do 11 ate o 19, desta forma leria apenas o 1° numero o 11 dai já sei que é SP. Voce possui exemplos.
    terça-feira, 28 de fevereiro de 2012 17:34
  • Boa tarde!

       Então seria assim, usando left(coluna,quantidade) para pegar os 2 primeiros digitos e usando o between para verificar se o valor está entre dois valores:
    SELECT  
      telefone
     ,uf=(CASE WHEN left(telefone,2) between 11 and 19 THEN 'SP' ELSE 
    	  CASE WHEN left(telefone,2) between 21 and 23 THEN 'RJ' ELSE
    		 CASE WHEN left(telefone,2) between 41 and 45 THEN 'PR'  
    		 END
    	  END
         END)
    from [tabela]


     Espero ter lhe ajudado!! Se lhe ajudou, marque como resposta e ajude os outros usuários!

     Obrigado!!

    Thiago Rogerio
    www.thiagorogerio.com.br
    thiagorogeriobr@hotmail.com

    • Marcado como Resposta Leandro_19 quarta-feira, 29 de fevereiro de 2012 14:10
    terça-feira, 28 de fevereiro de 2012 18:03
  • Thiago sua solução funcionou, só tenho agora duas duvidas.

    1 - nos casos em que tenho apenas um codigo como brasilia que é 61 como fica a solução.

    2 - nos casos em que o ddd de um outro estado esta entre a seleção, exemplo os estado do Amazonas possui os seguintes codigos 92 e 97 e o para 93 e 94, neste caso devo usar a clausula OR como ficaria?
    quarta-feira, 29 de fevereiro de 2012 14:11
  • Bom dia
       Você pose usar outros operadores do SQL, como: IN, =, etc...   Segue exemplo:
    SELECT  
      telefone
     ,uf=(CASE WHEN left(telefone,2) between '11' and '19' THEN 'SP' ELSE 
    	  CASE WHEN left(telefone,2) between '21' and '23' THEN 'RJ' ELSE
    		 CASE WHEN left(telefone,2) between '41' and '45' THEN 'PR' ELSE
    		  CASE WHEN left(telefone,2) = '61' THEN 'DF' ELSE
    		   CASE WHEN left(telefone,2) in ('92','97') THEN 'AM' ELSE
    		     CASE WHEN left(telefone,2) in ('93','94') THEN 'PA' END
    		   END
    		  END
    		 END
    	  END
         END)
    from [tabela]

    Espero ter lhe ajudado!! Se lhe ajudou, marque como resposta e ajude os outros usuários!

    Obrigado!!

    Thiago Rogerio
    www.thiagorogerio.com.br
    thiagorogeriobr@hotmail.com

    quarta-feira, 29 de fevereiro de 2012 14:24
  • Thiago,

    na linha do codigo

    CASE WHEN left(telefone,2) = '61' THEN 'DF' ELSE, me retorna a mensagem

    Case expressions may only be nested to level 10.

    quarta-feira, 29 de fevereiro de 2012 17:01
  • leandro, veja este link....

    http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/15ef5240-3cef-43e0-99f7-b38cafaefb66


    Gilberto Herminio Analista de Desenvolvimento de Sistemas Mogi das Cruzes-SP desenvolvedor.ti@r7.com / gil_haf@ig.com.br

    quarta-feira, 29 de fevereiro de 2012 20:05
  • Obrigado a todos, ja resolvi segue abaixo a resolução

    USE SEU BD

    GO
    SELECT
    CASE
                       WHEN LEFT(NUMERO_ACESSO,2) = '68' THEN 'AC'
                       WHEN LEFT(NUMERO_ACESSO,2) = '82' THEN 'AL'
                       WHEN LEFT(NUMERO_ACESSO,2) IN ('92','97') THEN 'AM'
                       WHEN LEFT(NUMERO_ACESSO,2) = '96' THEN 'AP'
                       WHEN LEFT(NUMERO_ACESSO,2) BETWEEN '71' AND '77' THEN 'BA'
                       WHEN LEFT(NUMERO_ACESSO,2) IN('85','88') THEN 'CE'
                       WHEN LEFT(NUMERO_ACESSO,2) = '61' THEN 'DF'
                       WHEN LEFT(NUMERO_ACESSO,2) BETWEEN '27' AND '28' THEN 'ES'
                       WHEN LEFT(NUMERO_ACESSO,2) BETWEEN '62' AND '64' THEN 'GO'
                       WHEN LEFT(NUMERO_ACESSO,2) BETWEEN '98' AND '99' THEN 'MA'
                       WHEN LEFT(NUMERO_ACESSO,2) BETWEEN '31' AND '38' THEN 'MG'
                       WHEN left(Numero_Acesso,2) = '67' THEN 'MS'                                                        
                       WHEN left(Numero_Acesso,2) BETWEEN 91 AND 94 THEN 'PA'
                       WHEN left(Numero_Acesso,2) BETWEEN 65 AND 66 THEN 'MT'
                       WHEN left(Numero_Acesso,2) = '83' THEN 'PB'
                       WHEN left(Numero_Acesso,2) IN('81','87') THEN 'CE'
                       WHEN left(Numero_Acesso,2) IN('86','89') THEN 'PI'
                       WHEN left(Numero_Acesso,2) BETWEEN 41 AND 46 THEN 'PR'
                       WHEN left(Numero_Acesso,2) BETWEEN 21 AND 24 THEN 'RJ'   
                       WHEN left(Numero_Acesso,2) = '84' THEN 'RN'
                       WHEN left(Numero_Acesso,2) = '69' THEN 'RO'
                       WHEN left(Numero_Acesso,2) = '95' THEN 'RR'
                       WHEN left(Numero_Acesso,2) BETWEEN 51 AND 55 THEN 'RS'
                       WHEN left(Numero_Acesso,2) BETWEEN 47 AND 49 THEN 'SC'
                       WHEN left(Numero_Acesso,2) BETWEEN 11 AND 19 THEN 'SP'
                       WHEN left(Numero_Acesso,2) BETWEEN 51 AND 55 THEN 'RS'
                       WHEN left(Numero_Acesso,2) = '63' THEN 'TO'  
                       ELSE 'OUTROS' END AS UF
                      

    FROM TABELA

    quinta-feira, 1 de março de 2012 14:07