7
votes

Extraire le prénom et le nom de famille

J'ai une colonne nommée nom dans une table appelée test qui a le nom complet et j'essaie d'extraire le prénom et le nom de famille. J'ai donc écrit quelque chose comme ceci: xxx

mais c'est me donner une erreur disant:

msg 537, niveau 16, état 2, ligne 1 Paramètre de longueur non valide passé à la fonction de gauche ou de sous-chaîne.

THTA's parce que j'ai des valeurs dans le nom comme:

Nom:

Hopkins

Comment puis-je gérer ces?


0 commentaires

3 Réponses :


10
votes
Declare @t table ( [Name] varchar(100) )

insert into @t ( Name )
VALUES ( 'dennis hopper' ), ('keanu reaves'), ('thatgirl') 

SELECT
    [Name],
    CHARINDEX(' ', [Name]),
    CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
        LEFT([Name],CHARINDEX(' ',[Name])-1)
    ELSE
        [Name]
    END as FIRST_NAME,
    CASE WHEN CHARINDEX(' ', [Name]) > 0 THEN
        SUBSTRING([Name],CHARINDEX(' ',[Name])+1, ( LEN([Name]) - CHARINDEX(' ',[Name])+1) )
    ELSE
        NULL
    END as LAST_NAME
FROM @t

2 commentaires

Dans ce cas, je reçois prénom et nom de famille comme Hopkins, je veux le prénom comme Hopkins et Nom comme Null


Je l'ai eu, je viens de remplacer la partie d'autre dans le nom de famille avec NULL. Merci beaucoup



5
votes

Le problème avec votre code d'origine est ici: xxx pré>

si [nom] ne contient pas d'espace, Charindex renvoie 0. Vous soustrayez 1 et nourrissez-la dans la fonction de gauche. Lorsque le 2e paramètre à la fonction de gauche est -1, vous obtiendrez cette erreur. À mon avis, le moyen le plus simple de "résoudre" ce problème est de donner à la fonction Charindex quelque chose à trouver, comme ceci: p> xxx pré>

maintenant ... Ce code ne peut pas échouer. P>

Il vous suffit de faire ce seul endroit dans votre code d'origine, mais vous devez l'ajouter à la partie Last_Name également. Si vous ne le faites pas, vous obtiendrez des résultats incorrects (EventHough vous n'obtiendrez pas d'erreur). P>

SELECT [Name],
       LEFT([Name],CHARINDEX(' ',[Name] + ' ')-1)  AS FIRST_NAME,
       SUBSTRING([Name],CHARINDEX(' ',[Name] + ' ')+1,LEN([Name])) AS LAST_NAME
FROM   Test


0 commentaires

-4
votes

Nous pouvons également utiliser la fonction de localisation

Sélectionner Nom, À gauche (nom, localisez ('', nom) -1) comme nom_.name, Substrage (nom, localisez ('', nom) + 1, longueur (nom)) comme Last_Name Du test


1 commentaires

Cette question concerne SQL Server, pas MySQL.