【问题标题】:FirstName, LastName in SQL, too complex?SQL 中的 FirstName、LastName 太复杂?
【发布时间】:2009-12-05 03:22:46
【问题描述】:

这个 SQL 看起来很复杂,当一个或两个字段可以为 NULL 时,有没有更简单的方法来获取 FirstName、LastName?

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

【问题讨论】:

  • 如果您经常需要这样显示名称,创建一个持久计算字段可能是值得的。
  • @HLGEM - 有趣,也许一个答案会明确你的建议?

标签: sql sql-server tsql


【解决方案1】:

怎么样

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

如果firstnamelastname 为空,则整个第一个表达式(带有,)变为空,强制合并检查,第二,单独检查lastname,然后如果lastname 为空,最后是firstname

【讨论】:

  • 其实,你忘记了一个:COALESCE(LastName + ', ' + FirstName, LastName, FirstName, '这个可怜的傻瓜没有名字') 当然是在开玩笑。
  • 既然你在合并中加了一个逗号,这行得通吗?如果它确实有效,我可能刚刚学到了一些新东西,但我认为这永远不会有机会成为 NULL。
  • 当您在 TSQL 中将一个字符串连接到一个空字符串时,您会得到空值。如果其中一个为 null,则字符串常量在第一个参数中变为 null。
  • 一个通用的:设置@userName = RTRIM(ISNULL(@firstname + ', ', '') + ISNULL(@middleName + ', ', '') + ISNULL(@surname, ' '))
  • @isuruceanu - 这不起作用。如果 middleName 和 surname 为空,你会得到一个悬挂的逗号——这是我们试图避免的。
【解决方案2】:

如果您经常使用这种形式的名称,您可以使用持久计算列在表中预先计算。如果您需要,该列甚至可以被索引。

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

最大的好处是您不必再次编写这段代码,姓名将始终显示,并且您只需在添加或更改名字和姓氏时使用数据库时间来执行此操作。

【讨论】:

  • +1,nb,这适用于所有平台,语法略有不同
【解决方案3】:

我认为这根本不复杂... 在 MSSQL 上,您可以执行类似的操作

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

【讨论】:

  • 如果名称为空,我认为这很糟糕,这将返回一个逗号。我不会投反对票,但也不会投赞成票。 :)
  • 这不起作用...您会得到类似“Frist,”和“,Last”的结果
  • 对不起,但在问题中用户没有指定它。
  • @mRt,真的吗?您会在代码中输出悬挂逗号,因为有人没有指定它?
  • 我不知道。我只是发布了一个使用 Isnull() 的示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多