6
votes

Retourne premier et dernier mots dans un nom de personne - Postgres

J'ai une liste de noms et je souhaite séparer les premiers et derniers mots du nom d'une personne.

J'essayais d'utiliser la fonction "couper" sans succès. P>

Quelqu'un peut-il expliquer comment puis-je le faire? p>

Table: P>

Names
Mary Smith
Dinah Donald
Paul Silver


8 commentaires

C'est fondamentalement un problème insoluble. Stackoverflow.com/Questtions/1122328/... Garniture () n'a vraiment pas de sens pour ce problème. Peut-être pourriez-vous nous montrer ce que vous avez essayé - Montrez-vous le code américain! - Et nous pouvons vous aider à faire quelque chose qui fonctionne pour cet ensemble limité d'entrées.


Voulez-vous faire cela avec votre requête? Il serait assez facile de faire dans votre langage de script de côté serveur (PHP peut-être?) ... Regardez dans exploser ()


A.o. J'ai essayé de le faire à Postgres mais pas de succès. Je veux dire que j'ai essayé d'utiliser la garniture, mais cela n'a pas fonctionné du tout. Y a-t-il une autre fonction que vous pourriez savoir à Postgres, quelque chose comme: premier ("ma chaîne") et dernier ("ma chaîne")? Merci,


Comment avez-vous l'intention de gérer un nom comme joão da nova ? Le nom de famille est da nova . Ou de nombreux autres cas où les noms de famille contiennent des espaces. Sérieusement, n'essayez pas cela, c'est faux . kalzumeus.com/2010/06/17/... . Le seul moyen de séparer les prénoms et les noms de famille est de demander à la personne dont il est le nom. Et même alors, vous devez être prêt à les faire répondre "Eh bien, je n'ai pas de nom de famille" ou "Eh bien, je n'ai pas de prénom". Ou "quel nom de famille, j'ai trois différents". Ou "Pinyin ou personnages chinois simplifiés?"


@CRAIG: encore moins de cultures qui mettent le nom de famille avant le nom donné ou les noms de famille tels que "van den heuvel". Les noms sont fous compliqués.


Ok personnes, j'ai essayé quelque chose qui a fonctionné pour le prénom: Sélectionnez la sous-chaîne (nom de '^. *? (? = [])') Comme nom de tableau. Cela a résolu le problème avec le prénom. Quelqu'un peut-il me dire comment puis-je obtenir le nom de famille à l'aide de la sous-chaîne ... quelque chose comme Joao da Silva, alors après que le dernier espace, me renvoie "Silva". C'est de quoi j'ai besoin. Je n'essaie pas d'ouvrir une discussion sur si un nom devrait être comme celui-ci ou de cette façon. Dans mon cas particulier, j'ai juste besoin d'avoir ces informations comme décrit ici. Merci de m'aider, Samuel


@Samueldonadelli pour que vous ne souhaitiez pas réellement le "nom de famille", vous voulez "le dernier mot dans une chaîne".


@Cragringer merci pour les mains vers le haut. Je viens de modifier la question avec votre clarification.


3 Réponses :


6
votes

Vous pouvez le faire simplement avec des expressions régulières, comme:

substring(trim(name) FROM '^([^ ]+)') || ' ' || substring(trim(name) FROM '([^ ]+)$')


1 commentaires

Shiftplanning.com a fait cela exactement récemment. Ils ont estimé les noms des personnes algorithmiques, mais leur ont demandé de confirmer / corriger.



5
votes

Une autre approche, qui profite du traitement des chaînes Postgres, des fonctions intégrées:

SELECT split_part(name, ' ', 1) as first_token,
split_part(name, ' ', array_length(regexp_split_to_array(name, ' '), 1)) as last_token
FROM mytable          


1 commentaires

string_to_array () serait suffisant, pas de regex requis (le regexp_split_to_array est beaucoup plus lent, alors string_to_array () )



1
votes

Voici comment j'ai extrait les noms complets des courriels avec un point d'un point, par exemple Jeremy.thompson@abc.com xxx

résultat:

Jeremy | Thompson


Vous pouvez facilement remplacer le point avec un espace: xxx


0 commentaires