sql >> Databáze >  >> RDS >> Sqlserver

Extrahujte příjmení, jméno a příponu do samostatných sloupců

Opravdu byste měli tyto části jména uložit do samostatných sloupců (první normální forma), abyste se vyhnuli takové analýze.

Veškerou logiku můžete vložit do jednoho velkého volání vnořených funkcí, ale je docela užitečné je rozdělit do jednotlivých volání pomocí CROSS APPLY .

Analýza je přímočará:

  • najít pozici čárky
  • rozdělte řetězec na část před čárkou (LastName ) a část AfterComma
  • najít pozici první mezery ve druhé části AfterComma
  • rozdělte řetězec znovu na dvě části – tím získáte FirstName a zbytek (AfterSpace )
  • najít pozici mezery v AfterSpace
  • rozdělte řetězec znovu na dvě části – tím získáte Initial a Suffix .

Dotaz také kontroluje výsledky CHARINDEX - Pokud řetězec není nalezen, vrátí 0.

Je zřejmé, že pokud hodnota řetězce není v očekávaném formátu, dostanete nesprávný výsledek.

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

výsledek

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. Tabulka je specifikována dvakrát, jak jako cíl pro 'UPDATE', tak jako samostatný zdroj dat v mysql

  2. Escapování znaku ampersand v řetězci SQL

  3. HttpWebRequest běží poprvé pomalu v SQLCLR

  4. MySQL:Nevkládejte nový řádek, pokud jsou definované řádky stejné