Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Извлечете фамилията, собственото име и суфикса в отделни колони

Наистина трябва да съхранявате тези части от името в отделни колони (първата нормална форма), за да избегнете подобно анализиране.

Можете да поставите цялата логика в едно огромно извикване на вложени функции, но е доста удобно да ги разделите на единични извиквания с помощта на CROSS APPLY .

Анализът е директен:

  • намерете позицията на запетаята
  • разделете низа на части преди запетаята (LastName ) и част AfterComma
  • намерете позицията на първия интервал във втората част AfterComma
  • разделете отново низа на две части - това дава FirstName и останалите (AfterSpace )
  • намиране на позиция на интервал в AfterSpace
  • отново разделяне на низа на две части - това дава 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IN оператор SQL

  2. Каква е най-добрата практика за използване на SQL Server T-SQL обработка на грешки?

  3. Какъв тип данни трябва да се използва за съхраняване на телефонни номера в SQL Server 2005?

  4. Нещо като Data Driven Subscriptions SSRS Standard Edition 2008

  5. Как да премахнете базата данни с помощта на TSQL и GUI - SQL Server / TSQL Урок, част 25