0

Trino SQL Bài học 11: Các hàm xử lý chuỗi ký tự (String Functions)

Mục tiêu bài học:

  • Làm sạch và chuẩn hóa dữ liệu văn bản thô (thường gặp khi ingest data từ log hoặc user input).

  • Trích xuất các phần dữ liệu cụ thể từ một chuỗi dài.

  • Nắm vững quy tắc cốt lõi: Chỉ mục (Index) của chuỗi trong Trino bắt đầu từ 1, không phải từ 0 như các ngôn ngữ lập trình thông thường.

1. Ghép nối chuỗi (Concatenation)

Trino hỗ trợ hai cách để ghép nhiều chuỗi lại với nhau.

Cách 1: Sử dụng toán tử || (Chuẩn ANSI SQL) Đây là cách được khuyến khích sử dụng vì cú pháp ngắn gọn và đúng chuẩn phân tán.

SQL

SELECT 
    'Khách hàng ' || name || ' thuộc phân khúc ' || mktsegment AS customer_info
FROM tpch.tiny.customer;

Cách 2: Sử dụng hàm CONCAT() Hàm CONCAT nhận vào nhiều tham số và ghép chúng lại.

SQL

SELECT CONCAT('Trino ', 'SQL ', 'Bài 11') AS title; -- Kết quả: Trino SQL Bài 11

Cạm bẫy từ Bài 10: Nếu bạn ghép một chuỗi với một giá trị NULL bằng toán tử || hoặc CONCAT, kết quả trả về sẽ là NULL. Hãy dùng COALESCE bọc lại nếu bạn nghi ngờ có giá trị rỗng.

2. Làm sạch và định dạng chữ (Trimming & Casing)

Dữ liệu thực tế hiếm khi hoàn hảo. Chữ thường bị dư khoảng trắng ở hai đầu hoặc lộn xộn chữ hoa chữ thường.

  • TRIM(string): Xóa khoảng trắng ở cả hai đầu.

  • LTRIM(string): Xóa khoảng trắng ở đầu (Bên trái).

  • RTRIM(string): Xóa khoảng trắng ở cuối (Bên phải).

  • LOWER(string) / UPPER(string): Chuyển toàn bộ thành chữ thường / chữ hoa.

Ứng dụng thực tế: Chuẩn hóa để so sánh Khi bạn muốn tìm một đoạn text nhưng không rõ người dùng nhập có bị dư dấu cách hay viết hoa hay không:

SQL

-- Dù người dùng nhập ' AUTOMOBILE ' hay 'automobile', vẫn sẽ match
SELECT * 
FROM tpch.tiny.customer
WHERE UPPER(TRIM(mktsegment)) = 'AUTOMOBILE';

3. Đo lường và Trích xuất (Length & Substring)

Đo độ dài chuỗi: Dùng LENGTH(string) để lấy số lượng ký tự.

SQL

SELECT name, LENGTH(name) AS name_length
FROM tpch.tiny.customer
ORDER BY name_length DESC;

Cắt chuỗi với SUBSTRING(): Cú pháp: SUBSTRING(string FROM start FOR length) hoặc viết gọn SUBSTRING(string, start, length).

  • Luật thép: Ký tự đầu tiên nằm ở vị trí số 1.

SQL

-- Cắt lấy 5 ký tự đầu tiên
SELECT SUBSTRING('Trino Distributed Engine', 1, 5); -- Kết quả: 'Trino'

-- Nếu không truyền tham số length, nó sẽ cắt từ vị trí start đến hết chuỗi
SELECT SUBSTRING('Trino Distributed Engine', 7);    -- Kết quả: 'Distributed Engine'

4. Tìm kiếm và Thay thế (Position & Replace)

Tìm vị trí chuỗi con bằng STRPOS(): Hàm STRPOS(string, substring) trả về vị trí xuất hiện đầu tiên của chuỗi con. Nếu không tìm thấy, nó trả về 0.

SQL

-- Kiểm tra xem trong tên khách hàng có chứa chữ '123' hay không
SELECT name
FROM tpch.tiny.customer
WHERE STRPOS(name, '123') > 0;

Thay thế chuỗi bằng REPLACE(): Cú pháp: REPLACE(string, search, replace). Hàm này sẽ tìm tất cả các chuỗi search và đổi thành replace.

SQL

-- Ẩn một phần số điện thoại (Ví dụ: đổi số '1' thành 'X')
SELECT phone, REPLACE(phone, '1', 'X') AS masked_phone
FROM tpch.tiny.customer;

5. Cắt chuỗi thành mảng (Mở đầu cho bài Array)

Một hàm cực kỳ hữu ích khi phân tích log là SPLIT(string, delimiter). Hàm này sẽ băm một chuỗi thành nhiều phần dựa trên một ký tự phân cách và trả về kiểu dữ liệu Mảng (ARRAY).

SQL

-- Chia số điện thoại '13-894-392-4467' thành các phần tử
SELECT phone, SPLIT(phone, '-') AS phone_parts
FROM tpch.tiny.customer;
-- Kết quả trả về một Array: ['13', '894', '392', '4467']

(Lưu ý: Chúng ta sẽ đi sâu vào cách bóc tách và truy vấn bên trong ARRAY ở Bài 30 & 31).


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí