none
separar nome, nome do meio e sobrenome RRS feed

  • Pergunta

  • bom dia,

    preciso criar uma sentença que separe o primeiro nome, nome do meio e sobrenome da seguinte forma:

     

    nome_completo: joão de oliveira da silva

    primeiro nome: joão

    nome do meio: de oliveira da

    sobrenome: silva

     

    grato.

    segunda-feira, 23 de maio de 2011 15:44

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
    segunda-feira, 23 de maio de 2011 19:43
  • 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.


    segunda-feira, 23 de maio de 2011 22:35
    Moderador

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
    segunda-feira, 23 de maio de 2011 16:17
  • 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 integer
    Declare @CaracterCorrente Char(01)
     
    --Nome completo
    Set @NomeCompleto = 'joão de oliveira da silva'
     
    --Pega o primeiro nome, indo até o primeiro espaço - 1
    Set @PrimeiroNome = Left(@NomeCompleto, CharIndex(' ', @NomeCompleto) - 1)
     
    -- Faz um While verificando a posição do último espaço
    while @i < Len(@NomeCompleto)
    begin
      Set @i = @i + 1;
      
      Set @CaracterCorrente = SubString(@NomeCompleto, @i, 1)
      
      if (@CaracterCorrente = ' ')
        Set @PosicaoUltimoEspaco = @i
    end
     
    -- Pega a posição do primeiro espaço em branco
    Set @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ço
    Set @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 texto
    Create Function dbo.fnc_RetornaPosicaoUltimoEspaco (@NomeCompleto VarChar(100)) Returns integer as
    Begin
      Declare @i integer = 0, @PosicaoUltimoEspaco integer = 0
      Declare @CaracterCorrente Char(01)
     
      While @i < Len(@NomeCompleto)
      begin
        Set @i = @i + 1;
     
        Set @CaracterCorrente = SubString(@NomeCompleto, @i, 1)
        
        if (@CaracterCorrente = ' ')
          Set @PosicaoUltimoEspaco = @i
      end
      
      Return @PosicaoUltimoEspaco
    End
    GO
     
    -- SIMULAÇÃO
    Declare @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'  = Case
                          When (CharIndex(' ', Nome, CharIndex(' ', Nome) + 1) > 0) Then
                            SubString(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.

    segunda-feira, 23 de maio de 2011 18:04
    Moderador
  • 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
    segunda-feira, 23 de maio de 2011 19:43
  • 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.


    segunda-feira, 23 de maio de 2011 22:35
    Moderador
  • 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);

    terça-feira, 10 de maio de 2016 17:51