2009-12-05 6 views
4

Ce SQL semble complexe, existe-t-il un moyen plus simple d'obtenir FirstName, LastName lorsque l'un des champs ou les deux peuvent être NULL?Prénom, Nom dans SQL, trop complexe?

SELECT COALESCE(LastName,'')+ 
     CASE WHEN LastName+FirstName IS NOT NULL THEN ', ' END+ 
     COALESCE(FirstName,'') AS Name 
FROM Person 
+0

Si vous avez souvent besoin de noms affichés comme ceci, cela peut valoir la peine de créer un champ calculé persistant. – HLGEM

+0

@HLGEM - Intéressant, peut-être une réponse ferait clairement votre suggestion? – Hogan

Répondre

13

Que diriez-vous

SELECT COALESCE(LastName + ', ' + FirstName, 
       LastName, FirstName) Name 
FROM Person 

si firstname ou lastname est nulle toute première expression (avec le ,), devient nulle, ce qui oblige le soudent à examiner, en second lieu, le seul lastname, puis si lastname est nulle, enfin, le firstname seul.

+2

En fait, vous en avez oublié un: COALESCE (Nom + ',' + Prénom, Nom, Prénom, 'Ce pauvre meunier n'a pas de nom') Je plaisante, bien sûr. – Stu

+0

Est-ce que cela fonctionnerait puisque vous mettez une virgule dans la fusion? Je pourrais avoir appris quelque chose de nouveau si cela fonctionne, mais je pense qu'il n'y aurait jamais de chance que cela soit NUL. – Dusty

+5

Lorsque vous concaténez une chaîne en une chaîne nulle dans TSQL, vous obtenez null. La constante de chaîne va à null dans le premier argument si l'une est nulle. – Hogan

-3

Je ne pense pas que ce soit complexe du tout ... Sur MSSQL vous pouvez faire quelque chose comme

SELECT Isnull(LastName,'') + ', ' + Isnull(FirstName,'') 
FROM Person 
+3

Cela retournerait une virgule si les noms sont nuls, ce qui me semble mauvais. Je ne vais pas le minimiser, mais je ne vais pas le rejeter non plus. :) – Dusty

+1

Cela ne fonctionne pas ... vous obtenez des résultats comme "Frist", et ", Last" – Hogan

+0

Désolé, mais dans la question l'utilisateur ne le spécifie pas. – mRt

1

Vous pouvez précalculer cela dans une table en utilisant une colonne calculée peristed si vous utiliserez cette forme du nom souvent. La colonne pourrait même être indexée si vous en aviez besoin.

ALTER TABLE A 
ADD [person_name_last_first] AS COALESCE(LastName + ', ' + FirstName, 
       LastName, FirstName) PERSISTED 

Le plus grand avantage est que vous ne devez jamais écrire ce morceau de code à nouveau, les noms seront toujours affichés et que vous utilisez uniquement le temps de bases de données pour effectuer cette action lorsque les noms et prénoms sont ajoutés ou modifiés .

+0

+1, nb, ceci est disponible sur toutes les plateformes avec une syntaxe légèrement différente – Hogan

Questions connexes