Chuyển đến nội dung chính
Mô-đun 6 · Bài học 4 trong tổng số 424/57 trong khóa học~10 min
Bài học theo mô-đun (4/4)

Chuyển đổi CAST và loại

SQL được định kiểu mạnh: mỗi cột có một kiểu (INTEGER, TEXT, NUMERIC, DATE, TIMESTAMP…) và nhiều thao tác yêu cầu các loại để khớp. Khi họ không làm như vậy — hoặc khi bạn muốn định dạng một giá trị theo cách khác - bạn sử dụng cast.

Hai cú pháp tương đương

SQL
-- SQL standard:
CAST(123 AS TEXT)

-- PostgreSQL shorthand (più comune nella pratica):
123::text

Hai hình thức này giống hệt nhau. Viết tắt ::type nhỏ gọn hơn và xâu chuỗi độc đáo với các biểu thức khác:

SQL
SELECT ordered_at::date AS day,
       (oi.quantity * oi.unit_price)::numeric(10,2) AS total,
       id::text || ' - ' || email AS label
FROM   …;

Các diễn viên hữu ích trên tập dữ liệu

SQL
TIMESTAMP → DATE          ordered_at::date
NUMERIC   → INTEGER       price::int           -- tronca!
INTEGER   → NUMERIC       quantity::numeric    -- per evitare div. intera
INTEGER   → TEXT          id::text             -- per concatenare con ||
TEXT      → DATE          '2024-03-05'::date
NUMERIC   → TEXT          price::text          -- per LIKE su numeri

Khi diễn viên có thể thất bại

SQL
SELECT 'abc'::int;   -- ERRORE: invalid input syntax for type integer
SELECT '12.5'::int;  -- ERRORE: invalid input syntax for type integer
SELECT 12.5::int;    -- 12   (cast numerico-numerico: arrotonda)

Các lần truyền từ chuỗi → số hoặc chuỗi → ngày là rủi ro nhất: chúng gây ra lỗi nếu chuỗi không khớp chính xác với mong đợi định dạng. Trong sản xuất, trên dữ liệu ngoài, tốt nhất nên xác thực trước với TRIM / LOWER / biểu thức chính quy.

Truyền và ĐẶT HÀNG THEO

Một trường hợp tạo ra các lỗi nhỏ: sắp xếp các số được lưu dưới dạng văn bản.

SQL
SELECT '2', '10', '1' ORDER BY 1;  -- '1', '10', '2'   (alfabetico!)

Giải pháp: truyền vào bên trong ORDER BY:

SQL
SELECT code FROM articles ORDER BY code::int;

Hãy thử nó

tập thể dục#sql.m6.l4.e1
Nỗ lực: 0Đang tải…

Đối với mỗi đơn hàng, hiển thị id và ngày (chỉ phần ngày của order_at, thuộc loại ngày). Hai cột. Đặt hàng theo id.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Truyền DẤU THỜI GIAN → DATE giảm thời gian: order_at::date.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m6.l4.e2
Nỗ lực: 0Đang tải…

Đối với mỗi khách hàng, hãy hiển thị một cột nhãn nối id và email được phân tách bằng ' - ' (ví dụ: '1 - alice.rossi@example.com'). Đặt hàng theo id.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

|| toán tử yêu cầu các toán hạng cùng loại: truyền id vào văn bản là cách rõ ràng nhất.

Giải pháp khả dụng sau 3 lần thử