Tác giả: Lê Trung Kiên lớp java 08
Email: lekien.2803.cg@gmail.com
SĐT: 0942096947
Link bài toán: https://leetcode.com/problems/fix-names-in-a-table/

1. Mở đầu

Xin chào các bạn, mình viết ra bài viết này để chia sẻ phương pháp giải cũng như tư duy của mình về bài toán này của leetcode. Phương pháp của mình có thể không phải là tối ưu nhất, tuy nhiên mình sẽ phân tích, chia nhỏ bài toán ra thành các module nhỏ hơn để dễ giải quyết cũng như giúp các bạn hiểu được các yêu cầu mà bài toán đưa ra.

2. Đề bài

Cho bảng Users

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| user_id        | int     |
| name           | varchar |
+----------------+---------+
user_id là khóa chính của bảng.
Bảng này chứa ID và tên của người dùng. Tên chỉ bao gồm các ký tự chữ thường và chữ hoa.

Viết truy vấn SQL để sửa các tên sao cho chỉ ký tự đầu tiên là chữ hoa và các ký tự còn lại là chữ thường.

Trả về bảng kết quả được sắp xếp theo user_id.

Định dạng kết quả truy vấn nằm trong ví dụ sau.

Ví dụ 1:

Input: 
Users table:
+---------+-------+
| user_id | name  |
+---------+-------+
| 1       | aLice |
| 2       | bOB   |
+---------+-------+
Output: 
+---------+-------+
| user_id | name  |
+---------+-------+
| 1       | Alice |
| 2       | Bob   |
+---------+-------+

3. Phân tích

Ô kê, bảng kết quả trả về của chúng ta hầu như không có sự thay đổi gì về cột. Chỉ khác là chúng ta phải sắp xếp theo thứ tự của user_id. Đề bài yêu cầu chúng ta viết câu truy vấn sửa tên trong cột name sao cho chữ cái đầu tiên viết hoa, còn lại viết thường.

Để làm được điều này, chúng ta sẽ phải sử dụng đến hai hàm upper()lower(). Hàm upper() là để viết hoa chữ cái, còn hàm lower() thì ngược lại. Vấn đề là làm thế nào để chúng ta chỉ viết hoa chữ cái đầu tiên, những chữ cái còn lại viết thường?

Chúng ta sẽ sử dụng hàm left() để lấy ra được chữ cái đầu tiên bên trái của mỗi bản ghi của name. Với tham số truyền vào là left(name, 1) có nghĩa là chúng ta chỉ lấy 1 chữ cái từ phía bên trái sang phải của name. Kết hợp với hàm upper() thì chúng ta sẽ viết hoa được chữ cái đầu tiên.

Tiếp theo là hàm right() chúng ta sẽ dùng để lấy ra được tất cả chữ cái còn lại của name. Hàm right() sẽ giúp ta lấy được những chữ cái của name từ bên phải sang trái. Số lượng chữ cái truyền vào thì chúng ta chỉ cần lấy độ dài của name trừ đi 1. Tại sao lại trừ đi 1? Bởi vì 1 ấy chính là chữ cái đầu tiên viết hoa rồi. Sau đó chúng ta kết hợp với hàm lower() để viết thường các chữ cái còn lại.

Cuối cùng, ta sử dụng đến hàm concat() để nối hai chuỗi lại với nhau. Một chuỗi thì là chữ cái đầu viết hoa, chuỗi thứ hai là những chữ cái viết thường còn lại trong name.

Thế là xong! Đến bước tiếp theo thôi!

4. Code luôn cho nóng

Câu truy vấn của chúng ta sẽ như sau:

select user_id, concat(upper(left(name,1)),lower(right(name,length(name)-1))) as name
from Users
order by user_id

5. Kết thúc

Qua bài viết này, mình đã chia sẻ cho các bạn cách mình tư duy khi giải bài tập trên leetcode. Hi vọng bài viết giúp ích cho các bạn trong cách tư duy để giải các bài tập khác. Xin cám ơn các bạn đã dành thời gian đọc và theo dõi. Peace!!!