tableAに列名があるとしましょう
Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni
では、これらの結果を次のように3つの列に分けるにはどうすればよいですか。
FirstName MiddleName LastName
Jennifer Hughs
.
.
.
Raj Jai Soni
Substringで試しましたが、機能しませんでした。
tableAに列名があるとしましょう
Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni
では、これらの結果を次のように3つの列に分けるにはどうすればよいですか。
FirstName MiddleName LastName
Jennifer Hughs
.
.
.
Raj Jai Soni
Substringで試しましたが、機能しませんでした。
まあ、それは実際よりもはるかに簡単に見えます-特にあなたが複数のファーストネームやミドルネームを持つ人々を持ち始めた場合。
私のアプローチは、そのロジックをカプセル化するストアド関数を作成することです。インラインT-SQLステートメントでそれを説明するのはそれほど簡単ではありません。
これが最初の試みです-ミドルネームが1つしかない限り機能します:
CREATE FUNCTION dbo.SplitName(@InputName VARCHAR(200))
RETURNS @nameParts TABLE
(
FirstName VARCHAR(100),
MiddleName VARCHAR(100),
LastName VARCHAR(100)
)
AS BEGIN
DECLARE @FirstSpace INT, @LastSpace INT
SET @FirstSpace = CHARINDEX(' ', @InputName)
SET @LastSpace = CHARINDEX(' ', @InputName, @FirstSpace+1)
INSERT INTO @nameParts(FirstName, MiddleName, LastName)
SELECT
SUBSTRING(@InputName, 1, @FirstSpace),
CASE @LastSpace
WHEN 0 THEN CAST(NULL AS VARCHAR(100))
ELSE SUBSTRING(@InputName, @FirstSpace+1, @LastSpace - @FirstSpace)
END,
CASE @LastSpace
WHEN 0 THEN SUBSTRING(@InputName, @FirstSpace+1, 999)
ELSE SUBSTRING(@InputName, @LastSpace, 999)
END
RETURN
END
いくつかのサンプルデータを使用してこれをテストすると、次の結果が得られます。
DECLARE @nameTable TABLE (NameValue VARCHAR(100))
INSERT INTO @nametable VALUES('Jennifer Hughes')
INSERT INTO @nametable VALUES('Mike Nadrotosky')
INSERT INTO @nametable VALUES('Arnold Woods')
INSERT INTO @nametable VALUES('Raj Jai Soni')
SELECT *
FROM @nameTable
CROSS APPLY dbo.SplitName(nameValue)
そのSELECTの出力は次のとおりです。
NameValue FirstName MiddleName LastName
Jennifer Hughes Jennifer NULL Hughes
Mike Nadrotosky Mike NULL Nadrotosky
Arnold Woods Arnold NULL Woods
Raj Jai Soni Raj Jai Soni
@marc_sの答えは最も完全です。私がこれをしなければならなかった数回は、それらは一回限りのデータロードタイプのジョブでした。あなたのものが同じなら、私はExcelでそれをすることを強くお勧めします!
T-SQLでこれを行うために、SQLSharpの文字列分割関数を使用してこれを行いました。ただし、これは最終的に@marc_sと同様の結果をもたらすため、ここでは説明しません。