2017-01-30 6 views
1

SQL Server 2008データベースにc/o Full Nameという列があります。私は姓と名が分かれる問題を抱えています。私は自分のコラムにc/oを持っていますが、私はFirst/Last Namesが必要です。私は2番目と3番目のケースの声明に問題があることを知っていますが、私は何を変更する必要があるのか​​よくわかりません。私はそれらを参照するためにどこかにインデックス変数を格納する必要がありますか?SQL名とSQL名を解析する

Declare @t table ([name] varchar(100)) 

INSERT INTO @t (Name) 
SELECT Street1 FROM tblPeople 
WHERE CO = 'Y' AND LastName NOT LIKE 'SUMMERHAVEN INC' AND Street1 Like '%c/o%' 

SELECT 
    [name], 
    CHARINDEX(' ', [name]), 
    CASE WHEN CHARINDEX(' ', [name]) > 0 THEN 
     LEFT([name],CHARINDEX(' ',[name])-1) 
    ELSE 
     [name] 
    END as CO, 
    CASE WHEN CHARINDEX(' ', [name]) > 0 THEN 
     SUBSTRING([name],CHARINDEX(' ',[name])+1, (LEN([name]) - CHARINDEX(' ',[name])+1)) 
    ELSE 
     NULL 
    END as FIRST_NAME, 
    CASE WHEN CHARINDEX(' ', [name]) > 0 THEN 
     SUBSTRING([name],CHARINDEX(' ',[name])+1, (LEN([name]) - CHARINDEX(' ',[name])+1)) 
    ELSE 
     NULL 
    END as LAST_NAME 
FROM @t 
+0

を考えてみましょうSQL Serverのように見えますか?どのバージョン? –

+0

@HartCO私はquesitonでバージョンを追加しましたが、SQL Server 2008です。 – kevorski

+1

サンプルデータはどうですか?私たちはあなたのテーブルtblPeopleを持っていません。 –

答えて

1

開示:これは、このようなデータを解析することは悪い考えであるが、ここであなたが行く:

Declare @t table ([name] varchar(100)) 

insert into @t (Name) values ('c/o Full Name') 

SELECT 
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN 
    LEFT([name],CHARINDEX(' ',[name])-1) 
ELSE 
    [name] 
END as CO, 
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN 
    SUBSTRING([name],CHARINDEX(' ',[name])+1, CHARINDEX(' ',[name])) 
ELSE 
    NULL 
END as FIRST_NAME, 
CASE WHEN CHARINDEX(' ', [name]) > 0 THEN 
    SUBSTRING([name],CHARINDEX(' ',[name], CHARINDEX(' ',[name])+1), len([name])) 
ELSE 
    NULL 
END as LAST_NAME 
FROM @t 
+0

これはなぜこのようなデータを解析するのが悪い考えですか? – kevorski

+0

@kevorskiこれはデータを解析する信頼できる方法ではないためです。複数の名字をお持ちの場合はどうなりますか?またはユーザーがスペースを残す複雑な名字ですか?もちろん、あなたが変更できないソースからこのデータを取得した場合、あなたはあなたが持っているものにこだわっており、それがあなたの最善の策です。 – bc004346

1

ここにスペースを見つけるためのロジックように共通テーブル式を使用してのアプローチがありますブレーク・オンは合理的に自己文書化している。私の驚きに

Declare @t table ([name] varchar(100)) 

insert into @t (Name) 
select 'one two three' 
union select 'a bc def' 
union select 'one two' 
union select 'one' 

;with cte1 as 
(
    select name 
    ,charindex(' ', name) FirstSpace 
    from @t 
) 
, cte2 as (
    select name 
    , FirstSpace 
    ,charindex(' ', name, FirstSpace+1) SecondSpace 
    from cte1 
) 
select name 
, FirstSpace 
, SecondSpace 
, case when FirstSpace=0 then name else substring(name, 1, FirstSpace-1) end Company 
, case when SecondSpace=0 then null else substring(name, FirstSpace+1, SecondSpace-FirstSpace-1) end FirstName 
, case when SecondSpace=0 or SecondSpace=len(name) then null else substring(name, SecondSpace+1, len(name)-SecondSpace) end LastName 
from cte2 
2

PARSENAME()は2008年に

利用可能であった以下の

Declare @YourTable table (Name varchar(50)) 
Insert Into @YourTable values 
('c/o Cher') 
,('c/o John Smith') 
,('John Smith') 

Select * 
     ,FirstName=parsename(replace(ltrim(rtrim(replace(name,'c/o',''))),' ','.'),2) 
     ,LastName =parsename(replace(ltrim(rtrim(replace(name,'c/o',''))),' ','.'),1) 
From @YourTable 

戻り

Name   FirstName LastName 
c/o Cher  NULL  Cher 
c/o John Smith John  Smith 
John Smith  John  Smith 
+0

2005年にJohn PARSENAMEが初めて登場しました。:) –

+0

@SeanLange私はあなたがこれまでにこれについて私に知らせた人だと信じています。奇妙なドキュメントには2012 + –

+0

が表示されますええ、ドキュメントは少し奇妙です。 「他のバージョンを表示する」のようなものは、2012年に戻ってしまいますが、それ以外のアイテムはさらに元に戻ります。そして、あなたのように、2012年にのみ利用可能であることに言及します+これは間違っています。なぜ彼らがこのルートに行ったのか分かりません。 –