2017-03-06 60 views
0

"LastName、FirstName、Middle Name"という形式のカンマ区切り文字列のStudentsテーブルに名前フィールドがあります.SQLクエリでselectステートメントを実行している間に、 SQLでこれを達成するにはどうしたらいいですか?中期のintialは利用できません。SQL Serverの列に文字列を分割します

SUBSTRING(Name,CHARINDEX(',',Name,1)+2,LEN(Name)) AS FirstName, 
SUBSTRING(Name,1,CHARINDEX(',',Name,1)-1) AS LastName, 

上記のコードは、ミドルネームがない場合に正常に機能します。

+1

あなたはいくつかのサンプルデータをポストすることはできますか? –

+0

@RaduGheorghiu ':James、Billy、L' '例:James、Billy' – James

+0

次にミドルネームはどうですか? – Wanderer

答えて

1

これは、あなたが必要なものを与える必要があります。

declare @tmp table (fullname varchar(100)); 
insert @tmp values('James, Billy, L'), ('John, Snow'); 

select 
    fullname 
    , [Last Name] 
    , case 
     when charindex(',', Remainder, 0) > 0 
      then ltrim(substring(Remainder, 0, charindex(',', Remainder, 0))) 
     else ltrim(Remainder) 
    end [First Name] 
    , case 
     when charindex(',', Remainder, 0) = 0 
      then NULL 
     else ltrim(substring(Remainder, charindex(',', Remainder, 0) + 1, len(Remainder))) 
    end [Middle Name] 
from 
(select 
    fullname 
    , substring(fullname, 0, charindex(',', fullname, 0))      [Last Name] 
    , substring(fullname, charindex(',', fullname, 0) + 1, len(fullname))  [Remainder] 
from @tmp) result; 
0
Use CTE and SUBSTRING AND CHARINDEX funntions 

DECLARE @Name VARCHAR(100) = 'James, Billy, L' 
--DECLARE @Name VARCHAR(100) = 'James, '', L' 

;WITH _CTE (SplitedNames ,RemainStr) AS 
(
    SELECT SUBSTRING(@Name,0,CHARINDEX(',',@Name)), 
      SUBSTRING(@Name,CHARINDEX(',',@Name)+1,LEN(@Name)) 
    UNION ALL 
    SELECT CASE WHEN CHARINDEX(',',RemainStr) = 0 THEN RemainStr ELSE  
      SUBSTRING(RemainStr,0,CHARINDEX(',',RemainStr)) END, 
      CASE WHEN CHARINDEX(',',RemainStr) = 0 THEN '' ELSE 
      SUBSTRING(RemainStr,CHARINDEX(',',RemainStr)+1,LEN(RemainStr)) 
      END 
    FROM _CTE 
    WHERE RemainStr <> '' 
) 

SELECT SplitedNames FROM _CTE 
+0

私はすでに分割機能を持っていますが、これはSeparateカラムとして必要です – James

1

最初に、文字列内でカンマ(、)の出現を見つけます。次に、CASE式を使用してコンマの数を取得します。 2つのカンマがある場合、ミドルネームもそこにあると仮定できます。 1の場合、名と姓のみ。次に、LEFTRIGHTSUBSTRINGCHARINDEX文字列関数の組み合わせを使用します。

クエリ

select t.name, 
left(
    t.name, 
    charindex(',', t.name, 1) - 1 
) last_name, 
case t.comma_num 
when 2 
then substring(
     t.name, 
     charindex(',', t.name, 1) + 1, 
     len(name) - 
     (charindex(',', t.name, 1) + 1) - charindex(',', reverse(t.name), 1) + 1 
) 
when 1 
then right(
     t.name, 
     charindex(',', reverse(t.name), 1) - 1 
) 
else null end as first_name, 
case t.comma_num 
when 2 
then right(
     t.name, charindex(',', reverse(t.name), 1) - 1 
) 
else null end as middle_name 
from (
    select name, 
    len(name) - len(replace(name, ',', '')) comma_num 
    from [your_table_name] 
)t; 

Find demo here