Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Motar

Extrair parte do texto de um campo

Recommended Posts

Viva

Tenho uma tabela que tem um campo semelhante a este;

250;Escola;Musíca;2015

 

Pretendo extrair a palavra entre o 2 e o 3 ; (Musíca)

Tem como fazer isso?

Um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Tenho uma tabela que tem um campo semelhante a este;

250;Escola;Música;2015

 

Pretendo extrair a palavra entre o 2 e o 3 ; (Música)

Tem como fazer isso?

----

 

Sim, várias formas. A mais simples é utilizar a função CharIndex para encontrar as posições do segundo e terceiro ";", calcular o tamanho do elemento e então utilizar a função SubString para extrair o elemento desejado.

-- código 1
with Tabela_2 as (
SELECT coluna, 
       Pos2= CharIndex(';', coluna, (CharIndex(';', coluna)+1)),
       Pos3= DataLength(coluna) - CharIndex(';', Reverse(coluna)) +1
  from tabela
)
SELECT coluna, Elemento= Substring(coluna, (Pos2 +1), (Pos3 - Pos2 -1))
  from Tabela_2;

No código acima substitua toda ocorrência de "coluna" pelo nome da coluna e "tabela" pelo nome da tabela.

O código 1 funciona desde que sempre existam 4 campos na coluna, separados por ";".

 

Há formas mais elaboradas de se obter o mesmo resultado.

 

_____

linkedin.gif José Diz Belo Horizonte, MG - Brasil

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado a ambos pelas dicas

 

José Diz:

​Seu código mostra o texto existente entre o ponto e virgula 2 e 3 e também o texto a seguir ao ponto e virgula 3.

 

Optei por criar a função em anexo, está a funcionar mas é capaz de dar para simplificar um pouco o código.

Permite seleccionar separador e o intervalo que se pretende extrair

 

ALTER FUNCTION [dbo].[fcnTextoExtrair] (@SelSeparador nvarchar(50),@SelTexto nvarchar(250),@SelIntervalo int)
RETURNS nvarchar(250)
AS
BEGIN
DECLARE @TextoExtraido nvarchar(250),@SelIntervaloTemp int,@SelTextoTemp nvarchar(250),@SelSeparadorTemp int
SET @SelIntervaloTemp = 1
SET @SelTextoTemp = @SelTexto
SET @SelSeparadorTemp = 1
IF @SelTexto IS NOT NULL
BEGIN
IF CHARINDEX(@SelSeparador,@SelTexto) > 0
BEGIN
WHILE @SelIntervaloTemp < @SelIntervalo
BEGIN
IF CHARINDEX(@SelSeparador,@SelTextoTemp) > 0
BEGIN
SET @SelTextoTemp = SUBSTRING (@SelTextoTemp,CHARINDEX(@SelSeparador,@SelTextoTemp) + 1,250)
END
IF CHARINDEX(@SelSeparador,@SelTextoTemp) <= 0
BEGIN
SET @SelSeparadorTemp = @SelSeparadorTemp - 1
END
SET @SelIntervaloTemp = @SelIntervaloTemp + 1
END
If @SelSeparadorTemp < 0
BEGIN
SET @TextoExtraido = NULL
END
IF @SelSeparadorTemp = 0
BEGIN
SET @TextoExtraido = @SelTextoTemp
END
IF @SelSeparadorTemp > 0 AND CHARINDEX(@SelSeparador,@SelTextoTemp) = 0
BEGIN
SET @TextoExtraido = @SelTextoTemp
END
IF @SelSeparadorTemp > 0 AND CHARINDEX(@SelSeparador,@SelTextoTemp) > 0
BEGIN
SET @TextoExtraido = LEFT (@SelTextoTemp,CHARINDEX(@SelSeparador,@SelTextoTemp) - 1)
END
END
ELSE BEGIN
IF @SelIntervalo = 1
BEGIN
SET @TextoExtraido = @SelTexto
END
ELSE BEGIN
SET @TextoExtraido = NULL
END
END
IF @SelIntervalo = 1 AND ISNUMERIC(@TextoExtraido)<> 1
BEGIN
SET @TextoExtraido = NULL
END
END
ELSE BEGIN
SET @TextoExtraido = NULL
END
RETURN @TextoExtraido
END

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

José Diz:

​Seu código mostra o texto existente entre o ponto e virgula 2 e 3 e também o texto a seguir ao ponto e virgula 3.

 

Motar, o código 1 foi criado considerando-se que há quatro elementos na coluna e que os elementos estão separados pelo caractere ";", conforme o exemplo que você postou: 4 elementos, 3 separadores ";".

 

Antes de postar a sugestão presente no código 1 eu a testei e funcionou corretamente. Se algo a mais está sendo mostrado nos testes que você fez, uma possibilidade é que os dados não estão conforme o exemplo que postou; poderia verificar?

 

Para comprovar a correção do código:

use TempDB;

CREATE TABLE tabela (coluna varchar(200));
INSERT into tabela values ('250;Escola;Musíca;2015');
go

--
with Tabela_2 as (
SELECT coluna, 
       Pos2= CharIndex(';', coluna, (CharIndex(';', coluna)+1)),
       Pos3= DataLength(coluna) - CharIndex(';', Reverse(coluna)) +1
  from tabela
)
SELECT coluna, Elemento= Substring(coluna, (Pos2 +1), (Pos3 - Pos2 -1))
  from Tabela_2;

--
DROP TABLE tabela;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.