2

我有一个表MsStaff由几列组成。其中一列是StaffNameStaffName数据包含两个词的名字(如' Edy Harsono')和三个词的名字(如'Dian Felita Tanoto')。作为结果,我希望有一列显示我员工的 3 个单词名称(即'Felita')的中间名。

我想通过仅使用substringand输入查询来显示结果charindex

我试过这个:

select [middlename]=SUBSTRING(staffname,charindex(' ',staffname),charindex(' ',staffname))
from MsStaff

但它只显示“Feli”作为结果。出了什么问题,我该怎么办?

4

3 回答 3

4

我觉得要求很特别。一:讲师会要求一种解决方案,忽略名称中的许多常见元素和规则的例外情况(我有两个中间名,我认识很多没有中间名的人,我知道最后有两个或三个单词的人名称)。二:他们会限制你CHARINDEXSUBSTRING。三:他们会在没有向您充分解释(或给您时间和资源以自行学习)您应该如何解决问题的情况下要求您解决此问题。

说了这么多:

DECLARE @t TABLE(StaffName NVARCHAR(255));

INSERT @t 
SELECT 'Edy Harsono'
UNION ALL SELECT 'Dian Felita Tanoto'
UNION ALL SELECT 'Lisa Van der Hosen';

SELECT 
  SUBSTRING
  (
    StaffName,  
    CHARINDEX(' ', StaffName)+1, 
    CHARINDEX(' ', SUBSTRING(StaffName, CHARINDEX(' ', StaffName)+2, 255))
  ) FROM @t
  WHERE LEN(RTRIM(StaffName)) - LEN(REPLACE(RTRIM(StaffName), ' ', '')) = 2;

结果:

Felita

1 row(s) affected.

如果您可以删除CHARINDEX/SUBSTRING要求,则稍微更聪明的方法是:

SELECT PARSENAME(REPLACE(StaffName, ' ', '.'), 2)
FROM @t
WHERE LEN(RTRIM(StaffName)) - LEN(REPLACE(RTRIM(StaffName), ' ', '')) = 2;
于 2013-04-14T19:23:46.397 回答
1

您的第二个charindex(' ',staffname)返回第一个空格的位置,并且您使用此位置作为要获取的子字符串的长度。我想问题就在附近。

于 2013-04-14T19:26:38.943 回答
0

尝试这个:

Select @middleName =
   case When charindex(' ', staffname,  1 + charindex(' ', staffname)) > 0 Then
   Substring(staffname, charindex(' ',staffname), 
              charindex(' ', staffname,  1 + charindex(' ', staffname)) -
                (charindex(' ', staffname))) Else null End
于 2013-04-14T19:24:02.493 回答