Usuário com melhor resposta
Replace somente na segunda ocorrêcia

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.
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
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 -
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
-
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.
-