Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wyodrębnij nazwisko, imię i sufiks w osobnych kolumnach

Naprawdę powinieneś przechowywać te części nazwy w osobnych kolumnach (pierwsza normalna forma), aby uniknąć takiego parsowania.

Możesz umieścić całą logikę w jednym ogromnym wywołaniu zagnieżdżonych funkcji, ale całkiem przydatne jest rozdzielenie ich na pojedyncze wywołania za pomocą CROSS APPLY .

Analiza jest prosta:

  • znajdź pozycję przecinka
  • podziel ciąg na część przed przecinkiem (LastName ) i część AfterComma
  • znajdź pozycję pierwszej spacji w drugiej części AfterComma
  • ponownie podziel ciąg na dwie części - to daje FirstName a reszta (AfterSpace )
  • znajdź pozycję spacji w AfterSpace
  • ponownie podziel ciąg na dwie części - daje to Initial i Suffix .

Zapytanie sprawdza również wyniki CHARINDEX - zwraca 0, jeśli ciąg nie został znaleziony.

Oczywiście, jeśli wartość ciągu nie jest w oczekiwanym formacie, otrzymasz niepoprawny wynik.

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

wynik

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować ciąg na datę/godzinę w SQL Server za pomocą PARSE()

  2. Korzystanie z posiadania count() w klauzuli istnieje

  3. SQL — warunkowa klauzula WHERE

  4. Wstawiaj zbiorczo pola o stałej szerokości

  5. MSSQL w Pythonie 2.7