2008-12-08 7 views
4

3 champs: FirstName, middleName, LastNameQuel est le plus court TSQL pour concaténer le nom d'une personne qui peut contenir des valeurs nulles

Tous les champs peut être nulle, mais je ne veux pas d'espaces supplémentaires. Format devrait être "Premier Moyen Dernière", "First Last", "Last", etc.

+0

Je pense que la question devrait préciser * en ligne * SQL. Sinon, vous pouvez simplement faire un proc de caractère, comme l'une des réponses mentionnées. – ThinkingStiff

Répondre

4

utiliser une UDF:

`Select udfConcatName(First, Middle, Last) from foo` 

De cette façon, toute votre logique pour les noms concaténer est dans un endroit et une fois que vous avez obtenu, il écrit, il est à court d'appeler.

+1

Sauf si vous en faites un UDF "inline", cela affectera négativement les performances, comme udfs (sauf le type inline) se recompile sur l'exécution de evcery. Donc, ils sont bien pour une utilisation unique, dans une seule ligne sélectionnez. ou pour remplir une variable b4 une sélection de plusieurs lignes, mais pas sur chaque ligne d'un multiRow sélectionnez –

+0

Bonne peine. D'accord. Ce sera aussi lent que la mélasse si vous devez le faire avec un grand nombre de valeurs. –

3
LTRIM(RTRIM(ISNULL(FirstName, '') + ' ' + LTRIM(ISNULL(MiddleName, '') + ' ' + 
    ISNULL(LastName, '')))) 
+0

Notez que cela laissera des espaces supplémentaires entre le deuxième prénom et le nom de famille (si le deuxième prénom a des espaces à la fin), et aussi après le nom de famille (s'il a des espaces à la fin). –

10
LTRIM(RTRIM(
    LTRIM(RTRIM(ISNULL(FirstName, ''))) + ' ' + 
    LTRIM(RTRIM(ISNULL(MiddleName, ''))) + ' ' + 
    LTRIM(ISNULL(LastName, '')) 
    )) 

NOTE: Ce ne laissera pas arrière ou avant espaces. C'est pourquoi c'est un peu plus laid que d'autres solutions.

+0

Je serais curieux de savoir (sérieusement!) Pourquoi cela n'est pas utile ... Peut-être que le downvoter peut m'éclairer? Il fonctionne exactement comme demandé et couvre tous les cas d'angle. –

+0

Andrew, je déteste vraiment quand cela arrive. S'il vous plaît voter sur uservoice pour un changement: http://stackoverflow.uservoice.com/pages/general/suggestions/41056 –

+0

Ouais. Considérant que les deux autres solutions ne font pas vraiment ce qui est demandé ... Eh bien, je suppose que c'est juste des raisins verts de ma part. Je voudrais voir une certaine reddition de comptes si :( –

0

LTrim(RTrim(Replace(IsNull(Firstname + ' ', '') + isNull(MiddleName, '') + IsNull(' ' + LastName, ''), ' ', ' ')))

+0

TRIM n'est pas un nom de fonction intégré reconnu dans TSQL –

+0

ahh, désolé, aurait dû écrire Ltrim (rtrim (...)) –

8

En supposant par « espaces supplémentaires », vous voulez dire des espaces supplémentaires insérés au cours de la concaténation (ce qui est une hypothèse raisonnable, je pense que si vous avez des espaces supplémentaires dans vos données, vous devez nettoyer.):

ISNULL(FirstName + ' ', '') + ISNULL(MiddleName + ' ', '') + ISNULL(LastName, '') 

fonctionne, car vous ajouterez un espace au nom - qui, s'il est NULL, donne NULL - ce qui donne une chaîne vide.

Edit: Si vous ne comptez pas l'option SET - qui peut être une option de connexion ou db:

SET CONCAT_NULL_YIELDS_NULL OFF 
LTRIM(FirstName + ' ' + NULLIF(MiddleName + ' ', ' ') + LastName) 

est un tout petit peu plus court, mais un peu grand plus laid.

Edit2: Depuis que vous avez accepté la réponse UDF - OMI, qui est un peu un tricheur - est ici un peu dans la même veine:

SELECT a FROM b 

b est une vue. ;) Ou. une procédure stockée,

EXEC c 

Mais, depuis EXEC est facultative:

c 
+0

J'ai sélectionné l'UDF parce que c'était la solution la plus pratique. J'utiliserais probablement votre solution (pré-édition) sur un UDF, donc je vous ai donné un vote positif. –

+0

+1 Ceci est la meilleure/la plus courte réponse et répond entièrement aux exigences du PO. – ThinkingStiff

0
'"' + ltrim(rtrim(isnull(FirstName,''))) + ' ' + ltrim(rtrim(isnull(MiddleName,''))) + 
' ' + ltrim(rtrim(isnull(LastName,''))) + '","' + ltrim(rtrim(isnull(FirstName,''))) + 
' ' + ltrim(rtrim(isnull(LastName,''))) + '","' + ltrim(rtrim(isnull(LastName,''))) + 
'"' 

ETC

2

Pourquoi ne pas utiliser une colonne calculée sur la table qui effectue la concat pour vous en utilisant votre syntaxe préférée parmi les nombreux affichés ici? Ensuite, vous allez juste interroger la colonne calculée - très élégante et si vous persistez la colonne calculée, vous pouvez même obtenir une légère augmentation des performances. Example here

+0

Pourquoi la downvote? S'il vous plaît ne downvote sans un commentaire! –

1
replace(ltrim(rtrim(isnull(FirstName, '') + ' ' + isnull(MiddleName, '') + ' ' + isnull(LastName, ''))), ' ', ' ') 
0
DECLARE @first varchar(10) = 'First' 
DECLARE @middle varchar(10) = '' 
DECLARE @last varchar(10) = 'Last' 

LTRIM(RTRIM(
    @first 
    + ISNULL(NULLIF(' '+LTRIM(RTRIM(@middle)),' '),'') 
    + ISNULL(NULLIF(' '+LTRIM(RTRIM(@last)),' '),'') 
)) 

Pourquoi cela fonctionne

Les champs sont réduits à une chaîne vide si NULL ou un espace par les fonctions LTRIM, RTRIM et isNull. Cette valeur est préfixée avec un seul espace, puis comparée à un seul espace par la fonction NULLIF. Si égal, un résultat NULL. Si ce n'est pas égal, la valeur est utilisée.Enfin, ISNULL() est utilisé pour convertir la valeur NULL passée par NULLIF en une chaîne vide.

ISNULL(NULL,'')   -- this would return '' 
ISNULL(' Smith','')  -- this would return ' Smith' 
0
Select firstname, middlename, lastname, ProvidedName = 

RTrim(Coalesce(FirstName + ' ','') 
+ Coalesce(MiddleName + ' ', '') 
+ Coalesce(LastName + ' ', '') 
+ COALESCE('' + ' ', '') 
+ COALESCE(NULL, '')) 

From names 
Questions connexes