2016-05-27 12 views
2

ファーストネームにスペースがあり、スペースの後に1文字以上ある場合にのみミドルネームをファーストネームから分割することを検討しています。最初の名前としての文字列。次に、入力文字列が "MATE K"、次いで、2つの部分に分割されなければならない、SQL Serverのファーストネームから中間のイニシャルを分割する

ファーストネーム= MATE & MiddleInitial = K

されるが、入力文字列が "MATE KATE" である場合にはすべきである:

例えば分割しないでそのままにしてください。

ファーストネーム= MATE KATEここ

は私が仕事をした例であるが、予想通り、それは私に出力を与えるものではありません。

誰かお手伝いできますか?

declare @name as varchar(50) 
set @name ='MATE KATE' 
select left(@name, CHARINDEX(' ', @name)) as FirstName, 
substring(@name, CHARINDEX(' ', @name) +1, len(@name)-(CHARINDEX(' ',@name)-1)) as MiddleInitial 
+0

MATEKATEについては

FirstName MiddleInitial Mate Kate NULL 

' Mate Kate 'あなたはMateKaとしてファーストネームを必要とするスペースがありません。 te – mohan111

+0

@ mohan111入力文字列にスペースがある場合は、たとえば入力文字列が "MATE KATE"の場合はスペースも保存し、次に "MATE KATE"をfirstname列に格納します。 – M005

+0

「Mケイト」があれば? – gofr1

答えて

2

これは考えられるすべての不良文字列を考慮しませんが、開始点を与えます。そして、SQLではなく、CLRでこれを行うほうがよいでしょう。 SQLは本当にこのようなことを行うことになって、非常に限定されていません。

DECLARE @t TABLE (s VARCHAR(MAX)) 
INSERT INTO @t 
VALUES ('MATE K'), 
     ('MATE KATE') 


SELECT SUBSTRING(s, 1, 
        CASE WHEN SUBSTRING(REVERSE(s), 2, 1) = ' ' 
         THEN CHARINDEX(' ', s) - 1 
         ELSE LEN(s) 
        END) AS FirstName , 
     CASE WHEN SUBSTRING(REVERSE(s), 2, 1) = ' ' 
      THEN SUBSTRING(s, LEN(s), 1) 
      ELSE NULL 
     END AS MiddleName 
FROM @t 

は出力:

FirstName MiddleName 
MATE  K 
MATE KATE NULL 
+0

完璧!ありがとう.. – M005

+0

入力にスペースが増えると、結果が損なわれます。 – gofr1

+0

@ gofr1、スペースだけではありません:)あなたはすべての可能なケースを考慮することはできないと述べました。 –

0

これが役に立ちます。

declare @name as varchar(50) 
set @name ='MATE K' 
select CASE WHEN CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@name))),0)=2 THEN left(LTRIM(RTRIM(@name)), CHARINDEX(' ', LTRIM(RTRIM(@name)))) ELSE LTRIM(RTRIM(@name)) END AS firstname, 
CASE WHEN CHARINDEX(' ',REVERSE(LTRIM(RTRIM(@name))),0)=2 THEN LTRIM(RTRIM(substring(LTRIM(RTRIM(@name)), CHARINDEX(' ', LTRIM(RTRIM(@name))) +1, len(LTRIM(RTRIM(@name)))-(CHARINDEX(' ',LTRIM(RTRIM(@name)))-1)))) ELSE '' END as MiddleInitial 
+0

として保存します!これはMATEとKの間に複数のスペース(4つまたは5つのスペースがあります)がある場合、このMATE Kのような入力文字列を入力すると失敗する可能性があります。 – M005

+0

更新されたコードを見つけてください。 – Sandesh

0

これは、仕事をする必要があり、おそらくかかわらず、簡素化することができます。

DECLARE @name AS VARCHAR(50) 
SET @name = 'MATE K' 

SELECT CASE WHEN CHARINDEX(' ', @name) != LEN(@name) - 1 THEN @name 
      ELSE LEFT(@name, CHARINDEX(' ', @name)) 
     END AS FirstName , 
     CASE WHEN CHARINDEX(' ', @name) = LEN(@name) - 1 
      THEN SUBSTRING(@name, CHARINDEX(' ', @name) + 1, 1) 
      ELSE '' 
     END AS MiddleName 

Output: 
FirstName MiddleName 
MATE  K 

SET @name = 'MATE KATE' 

SELECT CASE WHEN CHARINDEX(' ', @name) != LEN(@name) - 1 THEN @name 
      ELSE LEFT(@name, CHARINDEX(' ', @name)) 
     END AS FirstName , 
     CASE WHEN CHARINDEX(' ', @name) = LEN(@name) - 1 
      THEN SUBSTRING(@name, CHARINDEX(' ', @name) + 1, 1) 
      ELSE '' 
     END AS MiddleName 

-- Output: 
    Output: 
FirstName MiddleName 
MATE KATE  
0
DECLARE @t table 
(name varchar(20)) 
INSERT INTO @t(name) values 
('MATE K'), 
('MATE KATE') 

select 
CASE WHEN LEN(substring(name, CHARINDEX(' ', name) +1, len(name)-(CHARINDEX(' ',name)-1))) > 1 
THEN 
NAME 
ELSE left(name, CHARINDEX(' ', name)) END as FirstName, 
CASE WHEN LEN(substring(name, CHARINDEX(' ', name) +1, len(name)-(CHARINDEX(' ',name)-1))) = 1 
THEN 
substring(name, CHARINDEX(' ', name) +1, len(name)-(CHARINDEX(' ',name)-1)) ELSE NULL END as MiddleInitial 
FROM @t 
0

XMLの助けを借りて:

DECLARE @name varchar(50), 
     @xml xml 

SET @name ='Mate Kate' 

SELECT @xml = CAST('<f><n>' + REPLACE(@name,' ','</n><n>') + '</n></f>' as xml) 

;WITH cte AS (
SELECT t.v.value('.','nvarchar(50)') as Names, 
     CASE WHEN LEN(t.v.value('.','nvarchar(50)')) = 1 THEN 1 ELSE 0 END as LenName, 
     row_number() over(order by t.v) as RowNumber 
FROM @xml.nodes('/f/n') as t(v) 
WHERE NULLIF(t.v.value('.','nvarchar(50)'),'') IS NOT NULL 
) 

SELECT 
    STUFF(
    (SELECT ' ' + NAMES 
    FROM cte 
    WHERE LenName = 0 OR (LenName = 1 and RowNumber = 1) 
    FOR XML PATH('')),1,1,'') as FirstName, 
    STUFF(
    (SELECT ' ' + NAMES 
    FROM cte 
    WHERE LenName = 1 AND RowNumber != 1 
    FOR XML PATH('')),1,1,'') as MiddleInitial 
'Mate Kate'については

または'Mate K'または'Mate K '

FirstName MiddleInitial 
Mate  K 

' M Kate 'または'M Kate'

FirstName MiddleInitial 
M Kate  NULL 
関連する問題