none
Manipulação de string RRS feed

  • Pergunta

  • Pessoal, boa tarde.

    Tenho uma tabela com o nome do campo ItPedVendaDescrProdAlt. É um campo que o usuário preenche da seguinte forma:

    MAGMA COMM                                                                                                                                                                                                                                                    
    SPECTRUS COMM
    TYPHOON BORDEAUX FIRST
    DELICATUS STD

    Eu preciso fazer uma programação que ele pegue apenas os nomes COMM, FIRST, STD de cada linha, pensei em usar o substring, mas as posições nunca serão as mesmas. Alguém pode me ajudar?

    select ipv.ItPedVendaDescrProdAlt, isnull(ipv.ItPedVendaDescrProdAlt, ''),
    cast (isnull(ipv.ItPedVendaDescrProdAlt, '') as varchar(10)),
    len(cast(isnull(ipv.ItPedVendaDescrProdAlt, '') as varchar(10))),
    len(cast(isnull(ipv.ItPedVendaDescrProdAlt, '') as varchar(10))) -6,
    right(len(cast(isnull(ipv.ItPedVendaDescrProdAlt, '') as varchar(10))) -6,4)

    --left(cast( isnull (ipv.ItPedVendaDescrProdAlt,'       ') as varchar),len( cast( isnull(ipv.ItPedVendaDescrProdAlt,'       ') as varchar)) - 6) as 'QTDS'
    from ITEM_PED_VENDA ipv

    quinta-feira, 25 de outubro de 2012 16:48

Respostas

  • boa tarde Molombito !

    Em todos os registros terá 1 destes casos (COMM, FIRST, STD ) ? serão somente estes ? eles sempre estarão por ultimo ? se sim, faça como abaixo, onde faço um case verificando qual a ultima letra e atribuo de acordo com as 3 palavras:

    create table #teste (coluna varchar(100))
    
    insert into #teste select 'MAGMA COMM'
    insert into #teste select 'SPECTRUS COMM'
    insert into #teste select 'TYPHOON BORDEAUX FIRST'
    insert into #teste select 'DELICATUS STD'                                                                                                                                                                                                                                                    
     
     
    select
    	[campo] = case when RIGHT(coluna,1) = 'M' then 'COMM'
    				   when RIGHT(coluna,1) = 'T' then 'FIRST'
    				   when RIGHT(coluna,1) = 'D' then 'STD' end
    from #teste
     
     


    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.

    • Marcado como Resposta Molombito quinta-feira, 25 de outubro de 2012 19:49
    quinta-feira, 25 de outubro de 2012 17:07
  • Se estas "linhas" forem realmente em registros diferentes, aí dá pra fazer facilmente, independente da palavra final.

    Vejam:

    Declare @Tabela Table (ItPedVendaDescrProdAlt Text)
    Insert Into @Tabela Values
    ('MAGMA COMM'), ('SPECTRUS COMM'), ('TYPHOON BORDEAUX FIRST'), ('DELICATUS STD'),
    ('ROBERSON FERREIRA'), ('ALEXANDRE MATAYOSI')
    
    Select
      Reverse(
        Left(
             Reverse(Convert(VarChar(8000), ItPedVendaDescrProdAlt)),
             CharIndex(' ', Reverse(Convert(VarChar(8000), ItPedVendaDescrProdAlt)))
            )
            )
    From
      @Tabela


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    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.

    • Marcado como Resposta Molombito quinta-feira, 25 de outubro de 2012 19:49
    quinta-feira, 25 de outubro de 2012 17:28
    Moderador
  • Deu certo!!!

    Obrigado a todos!!!

           (select top 1 case when RIGHT (cast(ipvv.ItPedVendaDescrProdAlt as varchar),1) = 'M' then 'COMM'
                       when RIGHT(cast(ipvv.ItPedVendaDescrProdAlt as varchar),1) = 'T' then 'FIRST'
                       when RIGHT(cast(ipvv.ItPedVendaDescrProdAlt as varchar),1) = 'D' then 'STD' end
                       
    from ITEM_PED_VENDA ipvv where ipvv.EmpCod = ipv.EmpCod and ipv.PedVendaNum = ipvv.PedVendaNum)

    • Marcado como Resposta Molombito quinta-feira, 25 de outubro de 2012 19:49
    quinta-feira, 25 de outubro de 2012 19:49

Todas as Respostas

  • Rapaz, isso vai dar um trabalho pra fazer em, T-SQL.

    De que forma você quer resgatar essas informações? Uma embaixo da outra, uma do lado da outra...?


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    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, 25 de outubro de 2012 17:06
    Moderador
  • boa tarde Molombito !

    Em todos os registros terá 1 destes casos (COMM, FIRST, STD ) ? serão somente estes ? eles sempre estarão por ultimo ? se sim, faça como abaixo, onde faço um case verificando qual a ultima letra e atribuo de acordo com as 3 palavras:

    create table #teste (coluna varchar(100))
    
    insert into #teste select 'MAGMA COMM'
    insert into #teste select 'SPECTRUS COMM'
    insert into #teste select 'TYPHOON BORDEAUX FIRST'
    insert into #teste select 'DELICATUS STD'                                                                                                                                                                                                                                                    
     
     
    select
    	[campo] = case when RIGHT(coluna,1) = 'M' then 'COMM'
    				   when RIGHT(coluna,1) = 'T' then 'FIRST'
    				   when RIGHT(coluna,1) = 'D' then 'STD' end
    from #teste
     
     


    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.

    • Marcado como Resposta Molombito quinta-feira, 25 de outubro de 2012 19:49
    quinta-feira, 25 de outubro de 2012 17:07
  • Outra pergunta: estas informações ficam em registros diferentes? Se for, é tranquilo de fazer.

    Ou ficam num único registro, separados por Enter, num campo Text?


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    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, 25 de outubro de 2012 17:24
    Moderador
  • Boa tarde,

    Experimente desta forma:

    SELECT 
        case when CHARINDEX(' ', ItPedVendaDescrProdAlt) > 0 
            then RIGHT(ItPedVendaDescrProdAlt, CHARINDEX(' ', REVERSE(ItPedVendaDescrProdAlt) ) - 1)
            else ItPedVendaDescrProdAlt
        end as Descricao
    FROM --...

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 25 de outubro de 2012 17:27
  • Se estas "linhas" forem realmente em registros diferentes, aí dá pra fazer facilmente, independente da palavra final.

    Vejam:

    Declare @Tabela Table (ItPedVendaDescrProdAlt Text)
    Insert Into @Tabela Values
    ('MAGMA COMM'), ('SPECTRUS COMM'), ('TYPHOON BORDEAUX FIRST'), ('DELICATUS STD'),
    ('ROBERSON FERREIRA'), ('ALEXANDRE MATAYOSI')
    
    Select
      Reverse(
        Left(
             Reverse(Convert(VarChar(8000), ItPedVendaDescrProdAlt)),
             CharIndex(' ', Reverse(Convert(VarChar(8000), ItPedVendaDescrProdAlt)))
            )
            )
    From
      @Tabela


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    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.

    • Marcado como Resposta Molombito quinta-feira, 25 de outubro de 2012 19:49
    quinta-feira, 25 de outubro de 2012 17:28
    Moderador
  • Molombito,

    Senão entendi errado, seria o caso de utilizar o Like em conjunto com alguns Unions, veja o exemplo abaixo:

    create table #teste (coluna varchar(100))
    
    insert into #teste select 'MAGMA COMM'
    insert into #teste select 'SPECTRUS COMM'
    insert into #teste select 'TYPHOON BORDEAUX FIRST'
    insert into #teste select 'DELICATUS STD'    
    
    Select * from #Teste
    Where Coluna Like ('%COMM%')
    Union
    Select * from #Teste
    Where Coluna Like ('%FIRST%')
    Union
    Select * from #Teste
    Where Coluna Like ('%STD%')
    ORDER BY COLUNA


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 25 de outubro de 2012 17:45
  • uma em baixo da outra, pois tem que ser uma para cada item do produto.
    quinta-feira, 25 de outubro de 2012 18:05
  • Então essas linhas que você colocou como exemplo ficam num único registro, cuja coluna é do tipo text???

    (Responda as outras perguntas por favor.)


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    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, 25 de outubro de 2012 18:42
    Moderador
  • em registros separados...
    quinta-feira, 25 de outubro de 2012 19:10
  • em registros separados, a coluna é tipo text....
    quinta-feira, 25 de outubro de 2012 19:16
  • Deu certo!!!

    Obrigado a todos!!!

           (select top 1 case when RIGHT (cast(ipvv.ItPedVendaDescrProdAlt as varchar),1) = 'M' then 'COMM'
                       when RIGHT(cast(ipvv.ItPedVendaDescrProdAlt as varchar),1) = 'T' then 'FIRST'
                       when RIGHT(cast(ipvv.ItPedVendaDescrProdAlt as varchar),1) = 'D' then 'STD' end
                       
    from ITEM_PED_VENDA ipvv where ipvv.EmpCod = ipv.EmpCod and ipv.PedVendaNum = ipvv.PedVendaNum)

    • Marcado como Resposta Molombito quinta-feira, 25 de outubro de 2012 19:49
    quinta-feira, 25 de outubro de 2012 19:49