Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
http://pt.m.wikipedia.org/wiki/Normaliza%C3%A7%C3%A3o_de_dados
Mas se possível normaliza a tabela , veja o trabalho para se obter uma informação simples.
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
>
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;
Viva José
Testei o código e verifiquei que está a funcionar :)
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 (
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.
_____
/applications/core/interface/imageproxy/imageproxy.php?img=http://social.technet.microsoft.com/Profile/Resources/Images/linkedin.gif&key=baf3887e2433f31c68ef8289decbb0e62dbf365faa74f7778adecff40c0622a6" alt="linkedin.gif" /> José Diz Belo Horizonte, MG - Brasil