Extrair primeiro nome usando SQL

Você tem um campo string onde guarda o nome completo e precisa escrever uma consulta que traga apenas o primeiro nome.

Eu cheguei ao resultado abaixo, não conseguindo uma consulta que funcionasse ao mesmo tempo com Firebird e SQL Server.

Firebird

SELECT IIF(POSITION(‘ ‘ IN NOME_COMPLETO) > 0, SUBSTRING(NOME_COMPLETO FROM 1 FOR POSITION(‘ ‘ IN NOME_COMPLETO) – 1), NOME_COMPLETO) FROM TABELA

SQL Server

SELECT CASE WHEN CHARINDEX(' ', NOME_COMPLETO) > 0 THEN SUBSTRING(NOME_COMPLETO, 1, CHARINDEX(' ', NOME_COMPLETO) - 1) ELSE NOME_COMPLETO END FROM TABELA

Qualquer idéia melhor é bem-vinda.

UPDATE: Baseado no feedback recebido, refatorei a consulta, veja aqui a versão 2.

9 Comments

  • Henrique Melicio
    8/11/2010 - 16:55 | Permalink

    Realmente muito bom, era tudo o que eu precisava =D

  • 8/11/2010 - 17:51 | Permalink

    MS SQL Server

    select top 10
    substring( Nome, 1, charindex(‘ ‘, Nome + ‘ ‘ ) )
    from Pessoa

    Não acha mais simples somar um espaço no Nome na hora de terminar a posição final, ao invés de executar duas vezes a charIndex no caso de Existir um espaço, fora o tempo de executar os “case when …” tbem.

  • 8/11/2010 - 17:56 | Permalink

    MS SQL Server

    select top 10
    left( Nome, charindex(‘ ‘, Nome + ‘ ‘ ) )
    from Pessoa

    Podem usar o left tbem no lugar do substring.

  • 8/11/2010 - 19:22 | Permalink

    Erick no caso do SQL Server você pode reduzir um pouco seu comando deixando da seguinte forma:

    SELECT ISNULL(SUBSTRING(NOME_COMPLETO,1,CHARINDEX(‘ ‘, NOME_COMPLETO)-1),NOME_COMPLETO) FROM TABELA

    Abraço,
    Diego Garcia

  • 8/11/2010 - 19:50 | Permalink

    Só para adicionar ao conteudo, eu precisei de algo esses dias no PostgreSQL e fiz algo assim:

    SELECT SPLIT_PART(NOME_COMPLETO, ‘ ‘, 1) FROM TABELA

  • Andre
    8/11/2010 - 21:06 | Permalink

    No MySQL uso assim: select substring_index(nome_completo, ‘ ‘, 1)

  • 8/11/2010 - 22:51 | Permalink

    Erick corrigindo para conseguir o resultado esperado sem utilizar o case when que você utilizou seria assim:

    SELECT ISNULL(NULLIF(SUBSTRING(NOME_COMPLETO,1,CHARINDEX(‘ ‘, NOME_COMPLETO)-1),”),NOME_COMPLETO) FROM TABELA

    Tinha esquecido que o substring só retorna NULL caso a coluna esteja com NULL, se não encontrar retorna uma string vazia ”, então se for vazia convertemos para NULL.

    O ideal seria mediar a performance para ver qual forma fica mais rápida.

    Abraço,
    Diego Garcia

  • 9/11/2010 - 07:41 | Permalink

    Emerson Lopes :

    MS SQL Server

    select top 10
    substring( Nome, 1, charindex(‘ ‘, Nome + ‘ ‘ ) )
    from Pessoa

    Não acha mais simples somar um espaço no Nome na hora de terminar a posição final, ao invés de executar duas vezes a charIndex no caso de Existir um espaço, fora o tempo de executar os “case when …” tbem.

    Com certeza ótima idéia adicionar o espaço no final! Obrigado.

  • Pingback: Extrair primeiro nome usando SQL v2.0 | Erick Sasse

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    *

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>