2009-12-05 70 views
4

这个SQL看起来很复杂,当一个或两个字段都可以为NULL时,是否有一种更简单的方法来获取FirstName,LastName?SQL中的名字,姓氏太复杂?

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

如果您经常需要像这样显示名称,创建一个持久性计算字段可能是值得的。 – HLGEM 2013-05-31 13:37:52

+0

@HLGEM - 有趣的,也许一个答案会明确你的建议? – Hogan 2013-05-31 13:39:29

回答

13

如何

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

如果firstnamelastname为null整个第一表达(与,)变为零,迫使聚结以单独检查,第二,所述lastname,然后,如果lastname为空,最后单独为firstname

+2

其实,你忘了一个: COALESCE(LastName +','+名字,姓氏,名字,'这个可怜的吸盘没有名字') 当然是在开玩笑。 – Stu 2009-12-05 03:31:18

+0

这个工作,因为你在coalesce中逗号?如果它能够工作,我可能会学到一些新的东西,但我会认为这绝不会是NULL的机会。 – Dusty 2009-12-05 03:35:25

+5

当您将字符串连接到TSQL中的空字符串时,您会得到空值。如果任何一个为null,则字符串常量在第一个参数中为空。 – Hogan 2009-12-05 03:44:47

-3

我不认为这是复杂的,在所有... 在MSSQL您可以通过使用peristed计算列,如果你要使用像做

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

这将返回一个逗号,如果名称为空,我认为它很差。我不会倒退它,但也不会赞成它。 :) – Dusty 2009-12-05 03:38:38

+1

这不起作用...你得到的结果像“Frist”和“,Last” – Hogan 2009-12-05 03:43:32

+0

对不起,但在用户的问题中没有指定它。 – mRt 2009-12-05 04:16:25

1

您可以在表中预先计算这这种形式的名字往往是。如果你需要的话,该列甚至可以被编入索引。

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

最大的好处是,你再也不用写这篇文章的代码,名称将持续显示并添加姓氏和名字时,你只能使用数据库的时间来执行此操作或改变。

+0

+1,nb,这在所有平台上都可用,语法略有不同 – Hogan 2013-05-31 14:08:17