1

tableAに列名があるとしましょう

Name
jennifer Hughs
Mike nadrotosky
Arnold Woods
Raj Jai Soni

では、これらの結果を次のように3つの列に分けるにはどうすればよいですか。

FirstName MiddleName LastName
Jennifer              Hughs
.
.
.
Raj        Jai       Soni

Substringで試しましたが、機能しませんでした。

4

2 に答える 2

3

まあ、それは実際よりもはるかに簡単に見えます-特にあなたが複数のファーストネームやミドルネームを持つ人々を持ち始めた場合。

私のアプローチは、そのロジックをカプセル化するストアド関数を作成することです。インライン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
于 2011-03-10T22:09:06.440 に答える
0

@marc_sの答えは最も完全です。私がこれをしなければならなかった数回は、それらは一回限りのデータロードタイプのジョブでした。あなたのものが同じなら、私はExcelでそれをすることを強くお勧めします!

  1. 表をManagementStudioからExcelにコピーして貼り付けます
  2. 列にテキストを使用する
  3. 列3の行全体を並べ替えて、上部にミドルネームがないものをすべて取得します。
  4. 列3が空のすべてのものを選択し、値を列2から列3に移動します
  5. データを宛先SQLテーブルにインポートします

T-SQLでこれを行うために、SQLSharpの文字列分割関数を使用してこれを行いまし。ただし、これは最終的に@marc_sと同様の結果をもたらすため、ここでは説明しません。

于 2011-03-10T22:25:04.667 に答える