sql >> データベース >  >> RDS >> Sqlserver

姓、名、サフィックスを別々の列に抽出する

    このような解析を避けるために、名前のこれらの部分を別々の列 (第 1 正規形) に格納する必要があります。

    すべてのロジックをネストされた関数の 1 つの巨大な呼び出しに入れることができますが、CROSS APPLY を使用してそれらを単一の呼び出しに分割すると非常に便利です。 .

    解析は簡単です:

    • コンマの位置を見つける
    • 文字列をコンマの前の部分に分割します (LastName ) と AfterComma の部分
    • 2 番目の部分の最初のスペースの位置を見つける AfterComma
    • 文字列を再度 2 つの部分に分割します。これにより、FirstName が得られます。 そして残り (AfterSpace )
    • AfterSpace でスペースの位置を見つける
    • 文字列を再び 2 つの部分に分割します - これにより Initial が得られます および Suffix .

    クエリは CHARINDEX の結果もチェックします - 文字列が見つからない場合は 0 を返します。

    明らかに、文字列値が期待される形式でない場合、間違った結果が得られます。

    DECLARE @T TABLE (Name varchar(8000));
    INSERT INTO @T (Name) VALUES
    ('Walker'),
    ('Walker,James M JR'),
    ('Smith,Jack P'),
    ('Smith,Whitney');
    
    SELECT
        Name
        ,LastName
        ,AfterComma
        ,FirstName
        ,AfterSpace
        ,MidInitial
        ,Suffix
    FROM
        @T
        CROSS APPLY (SELECT CHARINDEX(',', Name) AS CommaPosition) AS CA_CP
        CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN 
            LEFT(Name, CommaPosition - 1) ELSE Name END AS LastName) AS CA_LN
        CROSS APPLY (SELECT CASE WHEN CommaPosition > 0 THEN 
            SUBSTRING(Name, CommaPosition + 1, 8000) ELSE '' END AS AfterComma) AS CA_AC
    
        CROSS APPLY (SELECT CHARINDEX(' ', AfterComma) AS SpacePosition) AS CA_SP
        CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN 
            LEFT(AfterComma, SpacePosition - 1) ELSE AfterComma END AS FirstName) AS CA_FN
        CROSS APPLY (SELECT CASE WHEN SpacePosition > 0 THEN 
            SUBSTRING(AfterComma, SpacePosition + 1, 8000) ELSE '' END AS AfterSpace) AS CA_AS
    
        CROSS APPLY (SELECT CHARINDEX(' ', AfterSpace) AS Space2Position) AS CA_S2P
        CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN 
            LEFT(AfterSpace, Space2Position - 1) ELSE AfterSpace END AS MidInitial) AS CA_MI
        CROSS APPLY (SELECT CASE WHEN Space2Position > 0 THEN 
            SUBSTRING(AfterSpace, Space2Position + 1, 8000) ELSE '' END AS Suffix) AS CA_S
    

    結果

    Name                 LastName    AfterComma    FirstName    AfterSpace  MidInitial  Suffix
    Walker               Walker
    Walker,James M JR    Walker      James M JR    James        M JR        M           JR
    Smith,Jack P         Smith       Jack P        Jack         P           P
    Smith,Whitney        Smith       Whitney       Whitney
    



    1. SqlalchemyがWHERE句をFROMに複製しました

    2. AIがソフトウェア開発とテストをどのように変えるか

    3. SQL Serverの最新バージョン、エディション、およびSQLServerの履歴

    4. SQLの2つの列の違いを取得したい