Usuário com melhor resposta
separar nome, nome do meio e sobrenome

Pergunta
-
Respostas
-
Boa Tarde,
Caso você tenha 2005 ou superior, eu opto por uma alternativa SET Based (possivelmente mais performática).
DECLARE @t TABLE (NomeCompleto VARCHAR(50)) INSERT INTO @t VALUES ('joão de oliveira da silva') INSERT INTO @t VALUES ('Augusto Melo') INSERT INTO @t VALUES ('João') INSERT INTO @t VALUES ('Marcelo Gonçalves Araújo') ;WITH Nomes (NomeCompleto, Inicio, Fim) As ( SELECT NomeCompleto, CHARINDEX(' ',NomeCompleto), CASE WHEN CHARINDEX(' ',NomeCompleto) = 0 THEN 0 ELSE LEN(NomeCompleto) - CHARINDEX(' ',REVERSE(NomeCompleto)) + 1 END FROM @t) SELECT NomeCompleto, LEFT(NomeCompleto,Inicio) As Nome, CASE WHEN Inicio = Fim THEN '' ELSE SUBSTRING(NomeCompleto,Inicio + 1,Fim - Inicio - 1) END As NomeMeio, CASE WHEN Fim = 0 THEN '' ELSE RIGHT(NomeCompleto, LEN(NomeCompleto) - Fim) END As SobreNome FROM Nomes
Caso você use SQL Server 2000, podemos adaptar
DECLARE @t TABLE (NomeCompleto VARCHAR(50)) INSERT INTO @t VALUES ('joão de oliveira da silva') INSERT INTO @t VALUES ('Augusto Melo') INSERT INTO @t VALUES ('João') INSERT INTO @t VALUES ('Marcelo Gonçalves Araújo') SELECT NomeCompleto, LEFT(NomeCompleto,Inicio) As Nome, CASE WHEN Inicio = Fim THEN '' ELSE SUBSTRING(NomeCompleto,Inicio + 1,Fim - Inicio - 1) END As NomeMeio, CASE WHEN Fim = 0 THEN '' ELSE RIGHT(NomeCompleto, LEN(NomeCompleto) - Fim) END As SobreNome FROM ( SELECT NomeCompleto, CHARINDEX(' ',NomeCompleto) As Inicio, CASE WHEN CHARINDEX(' ',NomeCompleto) = 0 THEN 0 ELSE LEN(NomeCompleto) - CHARINDEX(' ',REVERSE(NomeCompleto)) + 1 END As Fim FROM @t) As Nomes
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 23 de maio de 2011 19:43
- Marcado como Resposta Eder Costa quarta-feira, 25 de maio de 2011 17:55
-
Emilio, refletindo mais sobre o assunto, consegui resolver de maneira clara, simples e performática a situação, com CTE (você não vai nem precisar criar função):
Declare @Tabela Table (Nome VarChar(100))
Insert Into @Tabela Values ('João de Oliveira da Silva'), ('Roberson Ferreira')
;With Tabela ([NomeCompleto], [PrimeiroNome], [UltimoNome]) as
(
Select
Nome,
'Primeiro nome' = Left(Nome, CharIndex(' ', Nome) - 1),
'Último nome' = Reverse(Left(Reverse(Nome), CharIndex(' ', Reverse(Nome)) - 1))
From
@Tabela
)
Select
NomeCompleto,
PrimeiroNome,
NomeDoMeio = Replace(Replace(NomeCompleto, UltimoNome, ''), PrimeiroNome, ''),
UltimoNome
From
Tabela
Roberson Ferreira
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.- Sugerido como Resposta Roberson Ferreira _Moderator segunda-feira, 23 de maio de 2011 22:35
- Marcado como Resposta Eder Costa quarta-feira, 25 de maio de 2011 17:55
Todas as Respostas
-
Boa Tarde,
Informe o SQL Server utilizado para que possamos saber que recursos temos à disposição.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível -
Fera, criei duas soluções, uma para um texto simples e uma para tabela. Verifique por favor./* -------------------------------------------------------------------------- *//* --- ESSE SCRIPT RESOLVE A SITUAÇÃO, CASO O NOME COMPLETO ESTEJA EM UMA --- *//* --- VARIÁVEL ISOLADA, OU SEJA, CASO SEJA SOMENTE UM REGISTRO --- *//* -------------------------------------------------------------------------- */Declare @NomeCompleto VarChar(100), @PrimeiroNome VarChar(20), @NomeDoMeio VarChar(40), @UltimoNome VarChar(20)Declare @i integer = 0, @PosicaoPrimeiroEspaco integer, @PosicaoUltimoEspaco integerDeclare @CaracterCorrente Char(01)--Nome completoSet @NomeCompleto = 'joão de oliveira da silva'--Pega o primeiro nome, indo até o primeiro espaço - 1Set @PrimeiroNome = Left(@NomeCompleto, CharIndex(' ', @NomeCompleto) - 1)-- Faz um While verificando a posição do último espaçowhile @i < Len(@NomeCompleto)beginSet @i = @i + 1;Set @CaracterCorrente = SubString(@NomeCompleto, @i, 1)if (@CaracterCorrente = ' ')Set @PosicaoUltimoEspaco = @iend-- Pega a posição do primeiro espaço em brancoSet @PosicaoPrimeiroEspaco = CharIndex(' ', @NomeCompleto)-- Pega o nome do meio: do primeiro espaço em branco + 1 até o último espaço em branco-- Mas só pega o nome do meio se existir mais de um espaço em branco no texto, pois pode NÃO ter nome do meio-- Ex.: 'Roberson Ferreira'if (CharIndex(' ', @NomeCompleto, @PosicaoPrimeiroEspaco + 1) > 0)Set @NomeDoMeio = SubString(@NomeCompleto, @PosicaoPrimeiroEspaco + 1, @PosicaoUltimoEspaco - @PosicaoPrimeiroEspaco - 1)-- Pega o último nome, a partir da posição do último espaçoSet @UltimoNome = Right(@NomeCompleto, Len(@NomeCompleto) - @PosicaoUltimoEspaco)Select @PrimeiroNome, @NomeDoMeio, @UltimoNome--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------/* ------------------------------------------------------------------------- *//* ESSE SCRIPT RESOLVE A SITUAÇÃO, CASO O NOME COMPLETO ESTEJA EM UMA TABELA *//* ------------------------------------------------------------------------- */-- Criação da função que retornará a posição do último espaço no textoCreate Function dbo.fnc_RetornaPosicaoUltimoEspaco (@NomeCompleto VarChar(100)) Returns integer asBeginDeclare @i integer = 0, @PosicaoUltimoEspaco integer = 0Declare @CaracterCorrente Char(01)While @i < Len(@NomeCompleto)beginSet @i = @i + 1;Set @CaracterCorrente = SubString(@NomeCompleto, @i, 1)if (@CaracterCorrente = ' ')Set @PosicaoUltimoEspaco = @iendReturn @PosicaoUltimoEspacoEndGO-- SIMULAÇÃODeclare @Tabela Table (Nome VarChar(100))Insert Into @Tabela Values ('João de Oliveira da Silva'), ('Roberson Ferreira')Select'Primeiro nome' = Left(Nome, CharIndex(' ', Nome) - 1),'Nome do meio' = CaseWhen (CharIndex(' ', Nome, CharIndex(' ', Nome) + 1) > 0) ThenSubString(Nome, CharIndex(' ', Nome) + 1, (dbo.fnc_RetornaPosicaoUltimoEspaco(Nome)) - (CharIndex(' ', Nome)) - 1)Else''End,'Último nome' = Right(Nome, Len(Nome) - dbo.fnc_RetornaPosicaoUltimoEspaco(Nome))From@Tabela
Roberson Ferreira
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. -
Boa Tarde,
Caso você tenha 2005 ou superior, eu opto por uma alternativa SET Based (possivelmente mais performática).
DECLARE @t TABLE (NomeCompleto VARCHAR(50)) INSERT INTO @t VALUES ('joão de oliveira da silva') INSERT INTO @t VALUES ('Augusto Melo') INSERT INTO @t VALUES ('João') INSERT INTO @t VALUES ('Marcelo Gonçalves Araújo') ;WITH Nomes (NomeCompleto, Inicio, Fim) As ( SELECT NomeCompleto, CHARINDEX(' ',NomeCompleto), CASE WHEN CHARINDEX(' ',NomeCompleto) = 0 THEN 0 ELSE LEN(NomeCompleto) - CHARINDEX(' ',REVERSE(NomeCompleto)) + 1 END FROM @t) SELECT NomeCompleto, LEFT(NomeCompleto,Inicio) As Nome, CASE WHEN Inicio = Fim THEN '' ELSE SUBSTRING(NomeCompleto,Inicio + 1,Fim - Inicio - 1) END As NomeMeio, CASE WHEN Fim = 0 THEN '' ELSE RIGHT(NomeCompleto, LEN(NomeCompleto) - Fim) END As SobreNome FROM Nomes
Caso você use SQL Server 2000, podemos adaptar
DECLARE @t TABLE (NomeCompleto VARCHAR(50)) INSERT INTO @t VALUES ('joão de oliveira da silva') INSERT INTO @t VALUES ('Augusto Melo') INSERT INTO @t VALUES ('João') INSERT INTO @t VALUES ('Marcelo Gonçalves Araújo') SELECT NomeCompleto, LEFT(NomeCompleto,Inicio) As Nome, CASE WHEN Inicio = Fim THEN '' ELSE SUBSTRING(NomeCompleto,Inicio + 1,Fim - Inicio - 1) END As NomeMeio, CASE WHEN Fim = 0 THEN '' ELSE RIGHT(NomeCompleto, LEN(NomeCompleto) - Fim) END As SobreNome FROM ( SELECT NomeCompleto, CHARINDEX(' ',NomeCompleto) As Inicio, CASE WHEN CHARINDEX(' ',NomeCompleto) = 0 THEN 0 ELSE LEN(NomeCompleto) - CHARINDEX(' ',REVERSE(NomeCompleto)) + 1 END As Fim FROM @t) As Nomes
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar segunda-feira, 23 de maio de 2011 19:43
- Marcado como Resposta Eder Costa quarta-feira, 25 de maio de 2011 17:55
-
Emilio, refletindo mais sobre o assunto, consegui resolver de maneira clara, simples e performática a situação, com CTE (você não vai nem precisar criar função):
Declare @Tabela Table (Nome VarChar(100))
Insert Into @Tabela Values ('João de Oliveira da Silva'), ('Roberson Ferreira')
;With Tabela ([NomeCompleto], [PrimeiroNome], [UltimoNome]) as
(
Select
Nome,
'Primeiro nome' = Left(Nome, CharIndex(' ', Nome) - 1),
'Último nome' = Reverse(Left(Reverse(Nome), CharIndex(' ', Reverse(Nome)) - 1))
From
@Tabela
)
Select
NomeCompleto,
PrimeiroNome,
NomeDoMeio = Replace(Replace(NomeCompleto, UltimoNome, ''), PrimeiroNome, ''),
UltimoNome
From
Tabela
Roberson Ferreira
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.- Sugerido como Resposta Roberson Ferreira _Moderator segunda-feira, 23 de maio de 2011 22:35
- Marcado como Resposta Eder Costa quarta-feira, 25 de maio de 2011 17:55
-
em C#
Complementando..
string nomeCompleto = "Norma Pereira da Silva Vasconcelos";
//string nomeCompleto = "Norma Pereira";
string primeiroNome = "";
string nomeMeio = "";
string sobreNome = "";
string[] arrayNome = nomeCompleto.Split(' ');
primeiroNome = arrayNome[0];
sobreNome = arrayNome[arrayNome.Length-1];
for (int i = 1; i < arrayNome.Length - 1; i++)
{
nomeMeio = nomeMeio += arrayNome[i] + " ";
}
MessageBox.Show("primeiroNome: " + primeiroNome + " | nomeMeio: " + nomeMeio + " | sobreNome: " + sobreNome);