none
Replace somente na segunda ocorrêcia RRS feed

  • Pergunta

  • Estou querendo que o REPLACE mude apenas a seguda ocorrência de um sequência de caracteres, é possível se não como posso obter um resultado parecido.

    |C300|1|510020091|1|10,000000|50,000000|||500,00|85235200|000|1556||||||||||

    Gostaria que o REPLACE pegasse apenas a seguda ocorrência da String "|1|"

    Estou fazendo dese jeito:

    replace(linha, '|1|', '|UN|')


    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.

    segunda-feira, 14 de janeiro de 2013 18:28

Respostas

  • Boa tarde,

    Experimente fazer uns testes desta forma:

    declare @Linha varchar(max);
    
    set @Linha = '|C300|1|510020091|1|10,000000|50,000000|||500,00|85235200|000|1556||||||||||';
    
    select LEFT(@Linha, CHARINDEX('|1|', @Linha, 1) + 2) + 
           REPLACE(RIGHT(@Linha, LEN(@Linha) - CHARINDEX('|1|', @Linha, 1) - 2), '|1|', '|UN|')

    Espero que ajude.


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


    • Editado gapimex segunda-feira, 14 de janeiro de 2013 18:50
    • Marcado como Resposta Marcos Rocha terça-feira, 15 de janeiro de 2013 10:27
    segunda-feira, 14 de janeiro de 2013 18:50

Todas as Respostas

  • Olá,

    Arranjei um método de conseguires fazer isso, mas é um bocado arcaico:

    Usando a função de separação de strings disponível em http://www.codeproject.com/Articles/38843/An-Easy-But-Effective-Way-to-Split-a-String-using, podes usar deste modo:

    SET NOCOUNT ON;
    
    DECLARE @TABLEOFVALUES TABLE 
    (  ROWID   SMALLINT, 
             [VALUE] VARCHAR(MAX) 
    );
    INSERT INTO @TABLEOFVALUES
    SELECT * FROM [dbo].[SPLIT] ('|', '|C300|1|510020091|1|10,000000|50,000000|||500,00|85235200|000|1556||||||||||');
    
    UPDATE @TABLEOFVALUES SET VALUE = 'UN' WHERE ROWID = 5
    
    DECLARE @Retorno VARCHAR(MAX);
    SET @Retorno = ''
    SELECT @Retorno = @Retorno + [VALUE] + '|' FROM @TABLEOFVALUES;
    
    PRINT @Retorno;
    

    Se precisares de correr isso numa tabela, aconselho a criares uma user function devidamente parametrizada.

    Espero ter ajudado.


    Pedro Martins
    Portugal
    https://www.linkedin.com/in/rechousa

    segunda-feira, 14 de janeiro de 2013 18:46
  • Boa tarde,

    Experimente fazer uns testes desta forma:

    declare @Linha varchar(max);
    
    set @Linha = '|C300|1|510020091|1|10,000000|50,000000|||500,00|85235200|000|1556||||||||||';
    
    select LEFT(@Linha, CHARINDEX('|1|', @Linha, 1) + 2) + 
           REPLACE(RIGHT(@Linha, LEN(@Linha) - CHARINDEX('|1|', @Linha, 1) - 2), '|1|', '|UN|')

    Espero que ajude.


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


    • Editado gapimex segunda-feira, 14 de janeiro de 2013 18:50
    • Marcado como Resposta Marcos Rocha terça-feira, 15 de janeiro de 2013 10:27
    segunda-feira, 14 de janeiro de 2013 18:50
  • Marcos, o campo vai ter um lugar fixo na sequencia de caracteres ? se tiver voce pode usar algumas funções do proprio sql, no caso abaixo faço o update pegando o left que não vai ter mudança, mas um substring das posições que vão mudar e depois um right do que não vai ser alterado:

    create table #teste (campo char(10))
    
    insert into #teste
    select '0000000000'
    
    update #teste
    set campo = left(campo,2) + REPLACE(substring(campo,3,2),'00','AA') + RIGHT(campo, 6)
    
    select * 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.

    segunda-feira, 14 de janeiro de 2013 18:58
  • Vou testar aqui e dou um retorno.

    Obrigado.


    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.

    segunda-feira, 14 de janeiro de 2013 19:06