2

MsStaffいくつかの列で構成されるテーブルがあります。列の 1 つは ですStaffName。データには、StaffName2 語の名前 ( 'Edy Harsono'など) と 3 語の名前 ( 'Dian Felita Tanoto'など) が含まれています。結果として、スタッフの 3 語の名前 ( 「Felita」 ) からミドル ネームを表示する列が必要です。

substringandcharindexだけでクエリを入力して結果を表示したい。

私はこれを試しました:

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

ただし、結果として「Feli」のみが表示されます。何が問題で、どうすればよいですか?

4

3 に答える 3

4

要件が独特だと思います。1: 講師は、名前の多くの一般的な要素とルールの例外を無視する解決策を求めるだろう (私には 2 つのミドル ネームがあり、ミドル ネームを持たない多くの人を知っています。最後に 2 つまたは 3 つの単語を持つ人を知っています)名前)。CHARINDEX2:とに制約されることSUBSTRING。3: 問題へのアプローチ方法を適切に説明する (または、自分で学ぶための時間とリソースを提供する) ことなく、この問題の解決策を求めてくること。

言ったことすべて:

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

2番目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 に答える