7
votes

Comment commander par nom de famille sur une colonne Nom totale?

J'ai une table SQL avec une colonne appelée Nom complet qui contient, par exemple, "John Smith".

Comment commander les données par le nom de famille qui apparaît dans la colonne FullName?

Pour un long nom comme "Laurence John Fishburne", je voudrais commander les données par le mot "poisson poisson".

Ainsi, les noms sont stockés dans l'ordre

  • Prénom
  • Prénoms
  • Nom de famille

    J'utilise Microsoft SQL Server 2005.


7 commentaires

Définir le nom de famille. Je m'appelle "Robert Henry Smith".


@Dominic: il faudrait probablement être le dernier mot que ce soit le caractère d'espace. Bien sûr, il y aura des exceptions, mais cela fonctionnerait probablement pour la plupart des noms.


J'ai clarifié dans la question.


Comment souhaitez-vous gérer Rembrandt Harmansszoon van Rijn ?


Idéalement, vous analyseriez le nom de famille dans un champ distinct, puis trier par ce champ.


@Red: J'aimerais que ça trier sur "Rijn".


Je traite avec ce type de données au travail toute la journée. Vous voulez sérieusement migrer vers des champs séparés, car il y a juste Way trop de exceptions à une règle simple que vous pouvez concocter.


8 Réponses :


0
votes

Cela dépend vraiment de la manière dont les noms sont stockés. En supposant «dernier, premier milieu», vous pouvez faire quelque chose comme

order by substring(0, charindex(',', FullName))


3 commentaires

Et en outre, si l'autre nom est la bonne chose de jeton dans la chaîne, utilisez la fonction inverse () avec la solution ci-dessus.


Veuillez relire la question. En outre, votre syntaxe de la fonction de sous-chaîne n'est pas valide.


@Gatekiller - Ma réponse a été écrite avant la nouvelle clarification dans la question initiale.



1
votes
fullname                   (No column name)
John Davis                  Davis
Harry Smith                 Smith
Allision Thomas Williams    Williams

1 commentaires

Vous n'avez pas besoin d'utiliser ce nombre d'appels de fonction (inverse + gauche + Reverse + Charindex + Reverse) pour déterminer la dernière chaîne du nom complet. Un seul droit + Charindex + Reverse devrait être tout ce dont vous avez besoin, voir ma réponse.



7
votes

Je ferais quelque chose comme: xxx


1 commentaires

Bien que la solution la plus efficace / optimale ne fonctionne pas, pourquoi le -1 ??



1
votes

En cas de doute, faites-le vous-même:

Select
*
From
Users
Order By
LTrim(Reverse(Left(Reverse(FullName), CharIndex(' ', Reverse(FullName))))) Asc,
FullName Asc -- Fall-over for when there isn't a last name


0 commentaires

2
votes

Essayez ceci, il utilise le nombre minimal de fonctions pour rechercher le dernier espace de la chaîne de nom complet, ce qui devrait aider les performances: xxx

sortie: xxx < / Pré>

Pour la meilleure performance et le tri le plus précis, vous devez diviser le nom en FirstName, Middlename et champs de nom de famille. Seul l'utilisateur entrant dans les données peut vraiment comprendre quelle partie du nom complet est le nom de famille.


2 commentaires

Cela échoue si la colonne n'a qu'un seul nom.


@Gatekiller, utilisez ceci, fonctionnera pour un nom NULL et un nom sans espaces: à droite (FULLNAME, ISNULL (NULLIF (Charindex (CharInDex)) - 1, -1), Len (Pleinname )))))



1
votes

Ce sera le truc: xxx


2 commentaires

Cela échoue si la colonne n'a qu'un seul nom.


@Gatekiller: Peut-être qu'il serait utile à tous les lecteurs si vous souhaitez qualifier des exigences telles que celles-ci dans votre question. Solution maintenant mise à jour pour inclure cette exigence supplémentaire.



7
votes

Au lieu de calculer ce que le nom de famille est chaque fois que vous souhaitez exécuter la requête, vous pouvez avoir une colonne calculée qui persiste la valeur réelle dans une colonne pouvant être utilisée comme vous le feriez une autre colonne.

ALTER TABLE Customer
    ADD LastName AS 
    case when CHARINDEX(' ', REVERSE(FullName)) > 0
    then RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) 
    else
    FullName
    end
    PERSISTED


2 commentaires

Cela échoue si la colonne n'a qu'un seul nom.


+1 Pour suggérer la colonne calculée - toutes les autres solutions ne seront pas en mesure d'utiliser des index. Bien que la meilleure voie soit nécessaire pour l'utiliser comme une solution intermédiaire jusqu'à ce que le nom puisse être séparé en plusieurs colonnes et sur le front-end / rapports / etc. changé pour gérer cela.



2
votes

Query xxx

Il retournera l'ordre des cordes par dernier mot.


0 commentaires