2017-02-23 6 views
0

"Mr John Smith"というフルストリングに完全な名前を書き戻す列があります。T-SQL - データの1つの列から姓を抽出する

姓のみを抽出するにはどうすればよいですか?

私のカラム名は "Contact_Name"です。

データソースには数千の名前が含まれており、一部にはハイフンが含まれています。第1の名前と第2の名前の間には常にスペースがあります。あなたのCONTACT_NAMEはスペースを毎回含まれている場合

おかげ

+1

拘束されていないユーザーは、個人の名前を入力することができますさまざまな方法の数は、ほぼ無制限であるように、これは、悪名高く難しい問題です。優れたソリューション:firstName、prefix、middleName、surname、title、suffixなどを別々のフィールドに分けてから、新しいスキーマへの移行中にデータをクリーンアップします。 –

+0

チャールズと同意すると、二重括りをした、あるいは複数の姓の姓を扱う人々はどうやって対処しますか?あなたのデータ*は常に姓を持つことを100%保証できますか? – iamdave

+0

姓は常に最後(最後のスペースの後)ですか? – vitalygolub

答えて

0

これは、すべての潜在的な姓をキャッチしませんが、あなたは、あなたの質問に求めているものを行います。

declare @Contact_Name nvarchar(100) = 'Mr John Smith'; 

select reverse(left(reverse(@Contact_Name) 
        ,charindex(' ',reverse(@Contact_Name),1)-1 
        ) 
      ) as Surname; 

戻り値:

Surname 
``````` 
Smith 
0

が、これはあなたの相対的な良い解決策を与える必要があります。

SELECT REVERSE('ad bbb cvb'), 
CHARINDEX(' ', REVERSE('ad bbb cvb')), 
LEN('ad bbbb cvb'),   
SUBSTRING('ad bbb cvb', 
      LEN('ad bbb cvb')-CHARINDEX(' ', REVERSE('ad bbb cvb'))+2, 
      LEN('ad bbb cvb')) 
+0

これはテストしましたか? 'Mr John Smith'の 'Contact_Name'に 'h'を返します。 – iamdave

0

うわー、これらの答えの一部であります超複雑...ここに簡略化したバージョンがあります:

DECLARE @NAMES TABLE (Name VARCHAR(55)); 
INSERT INTO @NAMES VALUES ('Mr. John Smith'); 
INSERT INTO @NAMES VALUES ('Mrs. Jane Smith'); 
INSERT INTO @NAMES VALUES ('Mr. John Doe'); 
INSERT INTO @NAMES VALUES ('Mr. Englebert Humperdink'); 
INSERT INTO @NAMES VALUES ('Ms. Maybe Happy-NotSoMuch'); 
INSERT INTO @NAMES VALUES ('Mr. Lovely Taco'); 

SELECT RIGHT(Name,CHARINDEX(' ',REVERSE(Name)) - 1) 
FROM @NAMES 
; 

戻り値:

Name 
----- 
Smith 
Smith 
Doe 
Humperdink 
Happy-NotSoMuch 
Taco 
関連する問題