01/10/2018, 17:25

Cắt họ tên ra thành họ + tên lót + tên trong SQL

Đang ngồi làm việc, bổng đồng nghiệp mình nhận một cuộc điện thoại từ ai đó. Sau một hồi đồng anh ta cười khà khà, anh ta trả lời qua điện thoại, cái đó thì anh chịu. Sau khi kết thúc điện thoại anh quay sang hỏi mình, “chuyên gia SQL – mọi người hay chọc mình như thế” làm được cái ...

Đang ngồi làm việc, bổng đồng nghiệp mình nhận một cuộc điện thoại từ ai đó. Sau một hồi đồng anh ta cười khà khà, anh ta trả lời qua điện thoại, cái đó thì anh chịu.

Sau khi kết thúc điện thoại anh quay sang hỏi mình, “chuyên gia SQL – mọi người hay chọc mình như thế”  làm được cái đó không?  Có ai từng làm chuyện đó chưa? Chuyện đó là chuyện gì? Đó là cắt họ tên, lót ra từng phần riêng biệt dựa trên SQL.

Hihihi, cái đó thì trên excel làm ì đùng, làm dễ òm, hầu như ai cũng biết. Vậy SQL ư …? Mình cũng chưa làm.

Vì lúc đó cũng bận việc, nên mình cũng không quan tâm lắm. Thế là ngày đó đã trôi qua. Và chuyện đó cũng được đóng lại bằng những câu nói phiếm.

Cuối tuần, ngồi rãnh rỗi, mình nghĩ đến câu hỏi của một đồng nghiệp mình hôm trước. Mình tự hỏi, sao trên excel làm được? còn SQL thì sao? chắc là có cách đó? mình thử tìm xem sao? Thế là sau một buổi loay hoay, thì mình cũng tìm được cách cắt họ tên ra. Vui ơi là vui, khi mình làm được điều mình nghĩ, thế là hôm nay mình lại có một trải nghiệm mới, một kinh nghiệm mới, và một thành tựu mới. Và dưới đây là thành quả của mình đấy.

Giả sử chúng ta cần cắt họ tên ra thành các phần riêng biệt như sau:

  • Họ
  • Tên lót
  • Tên

Trong khi đó dữ liệu bạn cần cắt là một chuỗi đầy đủ họ, tên lót và tên.

Mặc định trong cơ sở dữ liệu của chúng ta có bảng HR_Employee và cột FullName thuộc về bảng HR_Employee. Thuật toán như sau:

select FullName, LTRIM(RTRIM(LastName)) as LastName,      LTRIM(RTRIM(case when len(FullName)  >= len(LastName) + len(FirstName)+ 2

                       then substring(FullName, len(LastName) + 2, len(FullName) - len(FirstName) - len(LastName) - 2)

                       else '

                   end)) as MidName,

      RTRIM(LTRIM(FirstName))as FirstName

from (select FullName,

          (case when Patindex('% %',Reverse(FullName)) = 0 then FullName

                else Reverse(substring(Reverse(FullName),0,Patindex('% %',Reverse(FullName))) )

          end) as FirstName,

          substring(FullName,0, patindex('% %',FullName)) as LastName

      from HR_Employee) as E

Giải thích

Thuật toán trên sử dụng các hàm thông dụng bên dưới:

  • Reverse(): đảo ngược chuỗi
  • LTRIM(): cắt bỏ những khoảng trắng thừa đầu chuỗi (bên trái)
  • RTRIM(): cắt bỏ những khoảng trắng thừa cuối chuỗi (bên phải)
  • SUBSTRING():  trả về một chuỗi con trong chuỗi cha
  • LEN(): trả về chiều dài của một chuỗi
  • Patindex(): trả về thứ tự của một ký tự được truyền vào.

0