Làm việc với dữ liệu dạng text là chuyện hằng ngày khi đụng tới database. Giả sử bạn là dev cho một shop online, và bạn có một database người dùng. Bạn cần hiển thị họ tên đầy đủ của user cho banner chào mừng trên web, ví dụ: "Chào mừng, Otto Art!". Hoặc bạn cần chuẩn hóa tất cả email (ví dụ chuyển hết về chữ thường). Mấy trường hợp này thì không thể thiếu thao tác với chuỗi đâu nha.
PostgreSQL cho bạn mấy công cụ mạnh để xử lý text. Hôm nay mình sẽ nói về ba công cụ cơ bản nhất:
CONCAT()— nối chuỗi.UPPER()— chuyển chuỗi thành chữ in hoa.LOWER()— chuyển chuỗi thành chữ thường.
Làm việc với hàm CONCAT()
Hàm CONCAT() cho phép bạn ghép nhiều chuỗi lại thành một. Cực kỳ hữu ích nếu dữ liệu nằm ở nhiều cột khác nhau mà bạn cần gộp lại để hiển thị.
Cú pháp
CONCAT(string1, string2, ..., stringN)
string1,string2,stringN— chuỗi hoặc tên cột bạn muốn nối.- Trả về một chuỗi gồm tất cả các tham số đã nối lại.
Ví dụ: xử lý tên
Giả sử bạn có bảng students:
| first_name | last_name |
|---|---|
| Otto | Art |
| Maria | Chi |
| Anna | Pal |
Nhiệm vụ: hiển thị họ tên đầy đủ của sinh viên theo dạng "Tên Họ".
Câu truy vấn:
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM students;
Kết quả:
| full_name |
|---|
| Otto Art |
| Maria Chi |
| Anna Pal |
Chú ý ' ' giữa tên và họ nhé. Đó là dấu cách mình thêm vào để tách hai chuỗi.
Một số lưu ý khi dùng
CONCAT() sẽ bỏ qua NULL. Nếu một tham số là NULL, nó sẽ bị bỏ qua luôn. Nếu bạn chưa biết NULL là gì thì đừng lo, mình sẽ nói kỹ hơn ở bài sau nha.
Có thể dùng toán tử || thay cho CONCAT(), ví dụ:
SELECT first_name || ' ' || last_name AS full_name FROM students;
Đổi kiểu chữ: UPPER() và LOWER()
Giả sử bạn đang xử lý email mà user nhập đủ kiểu: ivan@example.com, IVAN@EXAMPLE.COM. Để chuẩn hóa thì thường cần:
- chuyển text về cùng một kiểu trước khi so sánh (ví dụ
lowercase). - làm nổi bật từ quan trọng (ví dụ
UPPERCASEcho tiêu đề).
UPPER(): chuyển text thành in hoa
Hàm UPPER() sẽ chuyển text thành toàn bộ chữ in hoa.
Cú pháp:
UPPER(string)
string— chuỗi hoặc tên cột dạng text.
Ví dụ:
Bảng students có thêm cột email:
| first_name | last_name | |
|---|---|---|
| Otto | Art | otto@example.com |
| Maria | Chi | MARIA@EXAMPLE.com |
| Anna | Pal | anna.pal@mail.ru |
Muốn hiển thị email ở dạng in hoa:
SELECT email, UPPER(email) AS email_upper
FROM students;
Kết quả:
| email_upper | |
|---|---|
| otto@example.com | OTTO@EXAMPLE.COM |
| MARIA@EXAMPLE.com | MARIA@EXAMPLE.COM |
| anna.pal@gmail.com | ANNA.PAL@GMAIL.COM |
LOWER(): chuyển text thành chữ thường
Tương tự, hàm LOWER() sẽ chuyển text thành toàn bộ chữ thường.
Cú pháp:
LOWER(string)
Ví dụ:
Chuyển email về chữ thường hết:
SELECT email, LOWER(email) AS email_lower
FROM students;
Kết quả:
| email_lower | |
|---|---|
| otto@example.com | otto@example.com |
| MARIA@EXAMPLE.com | maria@example.com |
| anna.pal@gmail.com | anna.pal@gmail.com |
Ví dụ thực tế và case study
Cùng tổng hợp lại mấy cái vừa học nha.
Tạo họ tên đầy đủ ở dạng in hoa
Câu truy vấn:
SELECT CONCAT(UPPER(first_name), ' ', UPPER(last_name)) AS full_name_upper
FROM students;
Kết quả:
| full_name_upper |
|---|
| OTTO ART |
| MARIA CHI |
| ANNA PAL |
Ở đây mình dùng CONCAT() để ghép tên và họ, rồi UPPER() để chuyển hết thành in hoa.
Ví dụ: chuẩn hóa email
Muốn chuyển tất cả email về chữ thường:
UPDATE students
SET email = LOWER(email);
Bây giờ tất cả email trong bảng đều đồng nhất, không quan trọng ban đầu viết hoa hay thường.
Cách hoạt động của lệnh UPDATE bạn sẽ học ở bài sau nha.
Tạo lời chào cho user
Thêm lời chào "Chào mừng" vào trước họ tên:
SELECT CONCAT('Chào mừng, ', first_name, ' ', last_name, '!') AS greeting
FROM students;
Kết quả:
| greeting |
|---|
| Chào mừng, Otto Art! |
| Chào mừng, Maria Chi! |
| Chào mừng, Anna Pal! |
Mấy lỗi hay gặp khi dùng hàm xử lý text
Nếu quên dấu cách trong CONCAT(), kết quả sẽ bị dính liền nhìn kỳ lắm. Ví dụ:
SELECT CONCAT(first_name, last_name) AS full_name
FROM students;
Kết quả sẽ là: "OttoArt", "MariaChi". Nhớ thêm dấu cách đúng chỗ nha.
Dùng NULL. Nếu một tham số của CONCAT() là NULL, chuỗi kết quả có thể bị thiếu. Ví dụ:
SELECT CONCAT(first_name, ' ', middle_name, ' ', last_name) AS full_name
FROM students;
Nếu middle_name = NULL, kết quả sẽ là "Otto NULL Art". Để tránh vụ này, bạn có thể dùng hàm COALESCE():
SELECT CONCAT(first_name, ' ', COALESCE(middle_name, ''), ' ', last_name) AS full_name
FROM students;
Chi tiết về NULL và hàm COALESCE() sẽ có ở bài sau nha :P
GO TO FULL VERSION