Coluna VarChar, conteúdo com ; trazer em linhas
11/06/2015
0
Preciso fazer um select numa tabela. Esta tabela tem uma coluna que pode conter vários resultados separados por ponto e vírgula.
Gostaria de saber como trago esses resultados em linhas?
Coluna
'resultado1;resultado2;resultado3;'
Trazer assim
resultado1
resultado2
resultado3
Alguém sabe?
Obrigado!
Ferefefe88
Posts
11/06/2015
Marcos P
A questão de desmembrar uma coluna em "n" linhas, já não parece ser tão tivial.
Existe um limite máximo de linhas que você vai gerar a partir de uma coluna ?
Se existir, você pode tentar montar uma query recursiva que execute a extração das informações tantas quantas forem as linhas a serem geradas.
Senão existir, com : um cursor + separação linha-a-linha + uma tabela temporária para armazenar as ocorrências... dá pra resolver isso !
Dê uma pensada nisso...
11/06/2015
Ferefefe88
11/06/2015
Marcos P
Em um loop você varreria todas as linhas do cursor e em um outro loop ( interno ao primeiro ), você desmembraria cada ocorrência de ";", inserindo o resultado na temporária.
Depois de varrer todas as linhas pelo cursor... a temporária teria todas as ocorrências que você procura !
11/06/2015
Jothaz
CREATE TABLE #TESTE (NUMERO INT, OBS VARCHAR(100), CODIGO_LIMPO VARCHAR(100)) INSERT INTO #TESTE (NUMERO,OBS) VALUES (1,'[2.10.AA] O ALVO É MOVEL') INSERT INTO #TESTE (NUMERO,OBS) VALUES (2,'[2.10.AC] O ALVO É MOVEL') INSERT INTO #TESTE (NUMERO,OBS) VALUES (3,'[2.10.SA] O ALVO[ED.DE.DE] É MOVEL') INSERT INTO #TESTE (NUMERO,OBS) VALUES (4,'[2.10.VA] O ALVO [11.1.11]É MOVEL') DECLARE @NUMERO INT, @OBS VARCHAR(100) DECLARE MYCURSOR CURSOR FOR SELECT NUMERO,OBS FROM #TESTE OPEN MYCURSOR FETCH NEXT FROM MYCURSOR INTO @NUMERO,@OBS WHILE @@FETCH_STATUS = 0 BEGIN DECLARE @DELI_INI VARCHAR(5), @DELI_fim VARCHAR(5) ,@CONT INT, @AUX VARCHAR(200), @POS_INI INT, @POS_FIM INT -- SETANDO O DELIMITADOR SELECT @DELI_INI = '[', @DELI_fim = ']' SELECT @OBS = LTRIM(RTRIM(@OBS)) PRINT @OBS + ' pri ' WHILE LEN(@OBS) > 0 BEGIN SELECT @POS_INI = CHARINDEX(@DELI_INI, @OBS) SELECT @POS_FIM = CHARINDEX(@DELI_FIM, @OBS) IF @POS_INI > 0 AND @POS_FIM > 0 BEGIN SELECT @CONT = (@POS_FIM - @POS_INI) + 1 SELECT @AUX = SUBSTRING(@OBS, @POS_INI, @CONT) --PARA JOGAR NO CAMPO_LIMPO UTILIZE O UPDATE A SEGUI UPDATE #TESTE SET CODIGO_LIMPO = @AUX WHERE NUMERO = @NUMERO SELECT @OBS = SUBSTRING(@OBS, @POS_FIM + 1, LEN(@OBS)) END ELSE BEGIN BREAK END END FETCH NEXT FROM MYCURSOR INTO @NUMERO,@OBS END CLOSE MYCURSOR DEALLOCATE MYCURSOR SELECT * FROM #TESTE --DROP TABLE #TESTE
11/06/2015
Marcos P
Mas você pode fazer, pesquisando os conceitos que coloquei.
Acredite, o melhor modo de aprender é fazendo !
11/06/2015
Ferefefe88
Sabe o que vou precisar fazer depois?
Pegar estes resultados e fazer um DE PARA
Mas como atualizar um "stringuinho" num "stringao"?
Exemplo:
valor1;valor2;valor3;valor4
Transformar em
valor1;valor2;valorindefinido;valor4
11/06/2015
Jothaz
Localiza onde vai concatenar, var partir o campo (substring) e concatenar o que você quer.
Clique aqui para fazer login e interagir na Comunidade :)