Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Ekstrak nama belakang, nama depan, dan akhiran ke dalam kolom terpisah

Anda benar-benar harus menyimpan bagian nama ini di kolom terpisah (bentuk normal pertama) untuk menghindari penguraian seperti itu.

Anda dapat memasukkan semua logika ke dalam satu panggilan besar fungsi bersarang, tetapi cukup praktis untuk memisahkannya menjadi satu panggilan menggunakan CROSS APPLY .

Penguraian langsung:

  • cari posisi koma
  • bagi string menjadi beberapa bagian sebelum koma (LastName ) dan bagian AfterComma
  • cari posisi spasi pertama di bagian kedua AfterComma
  • bagi string menjadi dua bagian lagi - ini memberikan FirstName dan sisanya (AfterSpace )
  • temukan posisi spasi di AfterSpace
  • bagi string menjadi dua bagian lagi - ini memberikan Initial dan Suffix .

Kueri juga memeriksa hasil CHARINDEX - mengembalikan 0 jika string tidak ditemukan.

Jelas, jika nilai string tidak dalam format yang diharapkan, Anda akan mendapatkan hasil yang salah.

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

hasil

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. JPA SQL Server Tidak ada pemetaan Dialek untuk tipe JDBC:-9

  2. Ulangi tabel menggunakan Cross apply dan UNION ALL hasilnya

  3. Kembalikan Daftar Semua Pemicu Server di SQL Server

  4. Bagaimana cara mengekspor data sebagai format CSV dari SQL Server menggunakan sqlcmd?

  5. Substring T-SQL - 3 Karakter Terakhir