Coluna VarChar, conteúdo com ; trazer em linhas

11/06/2015

0

Olá Pessoal,

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

Ferefefe88

Responder

Posts

11/06/2015

Marcos P

Separar as ocorrências dentro da mesma coluna, é simples de fazer ( use as funções CHARINDEX e SUBSTRING ).

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

11/06/2015

Ferefefe88

Como faria utilizando o cursor e inserindo na tabela temporária ?
Responder

11/06/2015

Marcos P

O cursor recuperaria todas as ocorrências ( linhas ) com a string ( coluna ) que você quer desmembrar.

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 !
Responder

11/06/2015

Ferefefe88

Tem algum exemplo disso?

Obrigado!
Responder

11/06/2015

Jothaz

Veja se o exemplo ajuda!

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 
Responder

11/06/2015

Marcos P

Pronto, infelizmente, não tenho...

Mas você pode fazer, pesquisando os conceitos que coloquei.

Acredite, o melhor modo de aprender é fazendo !
Responder

11/06/2015

Marcos P

Esse exemplo do Jothaz é um ótimo ponto de partida !
Responder

11/06/2015

Ferefefe88

Obrigado galera!
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
Responder

11/06/2015

Jothaz

Você vai usar a mesma lógica do exemplo acima.

Localiza onde vai concatenar, var partir o campo (substring) e concatenar o que você quer.
Responder

11/06/2015

Marcos P

Exato... são variações de mesmo tema !
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar