如何在全名列上按姓氏排序?

Gat*_*ler 6 sql-server

我有一个SQL表,其中包含一个名为FullName的列,其中包含"John Smith".

如何按FullName列中显示的姓氏订购数据?

对于像Laurence John Fishburne这样的长名字,我想用"Fishburne"这个词来订购数据.

因此,名称存储在顺序中

  • 名字
  • 中间名

我正在使用Microsoft SQL Server 2005.

Rec*_*cep 7

我会做的事情如下:

SELECT FullName
FROM TABLE
ORDER BY REVERSE(SUBSTRING(REVERSE(FullName), 0, CHARINDEX(' ', REVERSE(FullName)))) 
Run Code Online (Sandbox Code Playgroud)

  • 虽然不是最有效/最佳的解决方案,但为什么-1? (4认同)

Jos*_*ton 5

您可以使用计算列将实际值保存到可以像使用任何其他列一样使用的列中,而不是计算每次运行查询时的姓氏.

ALTER TABLE Customer
    ADD LastName AS 
        RIGHT(FullName, CHARINDEX(' ', REVERSE(FullName)) - 1) PERSISTED
Run Code Online (Sandbox Code Playgroud)

这将LastName列添加到Customer表中,使用指定的函数计算姓氏的值,并将其存储到物理表中.最后需要关键字PERSISTED才能将值保存到磁盘,否则每次运行查询时都会计算它.

编辑:处理没有空格的值:

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

虽然您可以使用此功能,但您将确定在这种情况下会发生什么.我的观点是表明可以使用案例陈述.您可能还希望将所有输​​出路径转换为相同类型以避免类型不匹配.


Gat*_*ler 1

如有疑问,请自己做:

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
Run Code Online (Sandbox Code Playgroud)