PostgreSQL: Xử lý các dấu công(+) dư thừa khi nối các field(column) trong cơ sở dữ liệu(database) bằng câu truy vấn SQL (query SQL).

Đây là một vấn đề tôi gặp phải trong quá trình làm việc trên một ứng dụng có sẵn với yêu xuất xuất là 5 field nhập và phân cách nhau bằng dấu +, tuy nhiên 1 hoặc nhiều field trong 5 field này có thể bị trống và không được có dư thừa dấu + khi xuất ra tập tin TXT.


Ngay từ lúc đọc xong yêu cầu tôi nghĩ ngay cách làm khá phức tạp phải viết nhiều điều kiện (condition) kiểm tra field trống, lúc nào thì thêm dấu cộng lúc nào thì không? Nếu cứ suy nghĩ theo hướng này thì nó sẽ rất rối, vì vây tôi liền chuyển sang một hướng suy nghĩ khác là cứ xuất hết ra toàn bộ các field kèm theo dấu + và sau đó chỉ loại bỏ các dấu công dư thừa ra là được. Bài viết này sẽ hướng dẫn kinhn nghiệm của tôi khi xử lý vần đề này bằng SQL.

Đầu tiên có rất nhiều giải pháp khác nhau để giải quyết vấn đề trên nhưng do tôi phải sử dụng trên một phần mềm có sẵn và có nhiều hạn chế nhất định về cách define (định nghĩa) cho một vấn đề, nên giải pháp trong bài viết này tôi sử dụng SQL của PostgreSQL để xử lý vì nền tảng database của ứng dụng được thực hiện trên PostgreSQL.

Đầu tiên để dễ hiểu hơn giả sử tôi có 5 field nhập (input) tên là "Field_01", "Field_02", "Field_03", "Field_04", "Field_05" và yêu cầu từ khách hàng là phải xuất tất cả dữ liệu của các field này ra thành một chuỗi theo dạng chuỗi "Field_01"+"Field_02"+"Field_03"+"Field_04"+"Field_05" và tất nhiên không được có khoảng trắng dư thừa. Sau khi phân tích tôi sẽ cho xuất cả 5 field này ra mà không quan tâm tới dữ liệu bị trống hay không, và tôi thây sẽ có 3 trường hợp dư dấu cộng(+) như sau:

  • Dư dấu công đầu tiên: "+Field_02+Field_03+Field_04+Field_05"
  • Dư dấu cộng cuối cùng: "Field_01+Field_02+Field_03+Field_04+"
  • Dấu cộng bị dư nhân lên nhiều lần: "Field_01+Field_02++Field_04+Field_05" hoặc(or) "Field_01+Field_02+++Field_05"

Sau khi cân nhắc tôi quyết định sử dụng "regexp_replace" function để giải quyết vấn đề, bằng cách thay dấu công(+) đầu vào cuối, và chuyển nhiều dấu cộng (multi +) thành một dấu công duy nhất, dưới đây là câu query để xử lý vấn đề, trong câu query bạn có thể xóa giá trị các field để tao dư các khoảng trắng ở các trường hợp khác nhau để kiểm tra kết quả:

select regexp_replace(regexp_replace('' || '+' || 'Field_02' || '+' || '' || '+' || 'Field_04' || '+' || '','^[+]|[+]$','','g'),'[+]+','+')

Với câu query trên kết quả tôi nhận được sẽ là:

Field_02+Field_04

Chúc các bạn một ngày tốt lành, nếu có thắc mắc, hay bổ sung nào, đừng ngần ngại, hãy thảo luận cùng tôi.


No comments:

Post a Comment