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

UDF và SQL cơ sở

Cho đến nay chúng tôi đã gửi truy vấn từ máy chủ Node.js. Nhưng nếu một công thức được sử dụng trong hàng chục truy vấn khác nhau (ví dụ: tính giá cuối cùng bao gồm VAT), tại sao lại lặp lại phép toán trong JavaScript? Hàm SQL (Hàm do người dùng xác định - UDF) chúng ta hãy tạo "macro" bên trong chính DB.

Đây là cách tạo macro SQL toán học:

SQL
CREATE OR REPLACE FUNCTION calculate_tax(price NUMERIC)
RETURNS NUMERIC AS $$
  SELECT price * 1.22;
$$ LANGUAGE sql;

Khi lệnh này chạy, hàm sẽ tồn tại mãi mãi trong cơ sở dữ liệu của chúng tôi. Nó có thể được gọi từ bất kỳ truy vấn nào:

SQL
SELECT name, calculate_tax(unit_price) AS price_with_tax FROM products;

Tạo động

Chúng ta có thể xác định bao nhiêu biến tùy thích, chỉ định loại của chúng và LANGUAGE sql sẽ chạy truy vấn và ngầm trả về câu lệnh cuối cùng được đặt giữa các ký hiệu đô la $$.

Hãy tự mình thử

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

Tạo một hàm có thể gọi đơn giản có tên là 'get_full_name' chấp nhận hai tham số TEXT ('first_name' TEXT, 'last_name' TEXT).\nNó phải trả về một giá trị TEXT.\nBên trong, hãy thực hiện một lệnh SELECT tầm thường để nối hai đối số bằng một khoảng trắng duy nhất giữa chúng và khai báo nó là ngôn ngữ sql.

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

TẠO HOẶC THAY THẾ CHỨC NĂNG get_full_name(first_name TEXT, Last_name TEXT) TRẢ LẠI VĂN BẢN NHƯ $$ CHỌN first_name || ' ' || họ; $$ NGÔN NGỮ sql;

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

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

Trong các UDF nâng cao hơn, chúng tôi có thể nhúng toàn bộ truy vấn. Tạo một hàm 'get_customer_count()' không chấp nhận tham số nào và TRẢ LẠI một INTEGER.\nBên trong, hãy chạy một hàm 'SELECT COUNT(id) TỪ khách hàng' tầm thường.\nKhai báo nó dưới dạng ngôn ngữ sql thuần túy.

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

Chú ý: COUNT trả về một bigint, chuyển nó thành INTEGER để khớp với kiểu trả về! TẠO HOẶC THAY THẾ CHỨC NĂNG get_customer_count() TRẢ LẠI SỐ TIN NHƯ $$ CHỌN CAST(COUNT(id) NHƯ INTEGER) TỪ khách hàng; $$ NGÔN NGỮ sql;

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