Đặt vấn đề báo giá ngay lập tức của bạn sang một bên (đã được Jeff giải quyết đúng cách), chức năng có thể đơn giản và nhanh hơn nhiều như thế này:
CREATE or REPLACE FUNCTION q11(partial_title text)
RETURNS SETOF text
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY
SELECT m.title || ' has ' || m.ncrew || ' cast and crew'
FROM movie_makers m
WHERE m.title ~* $1;
IF NOT FOUND THEN
RETURN NEXT 'No matching titles';
END IF;
END
$func$;
Những điểm chính:
-
Chức năng của bạn vẫn bị hỏng. Tham chiếu đến
movie_makers.title
vàmovie_makers.ncrew
sẽ không hoạt động theo cách đó. Tôi đã sửa nó. -
Sử dụng
RETURN QUERY
thay vì vòng lặp. Bằng cách này, chúng tôi cũng không cần sử dụng hoặc thậm chí khai báo bất kỳ biến nào cả. Xem: -
Tùy chọn sử dụng toán tử đối sánh cụm từ thông dụng không phân biệt chữ hoa chữ thường
~*
. (Đơn giản hơn, không nhanh hơn.)Dù bằng cách nào, bạn có thể muốn thoát các ký tự đặc biệt. Xem:
Ngoài ra:hầu như không hợp lý khi lọc trên một chế độ xem đã chọn 'Câu lạc bộ chiến đấu' làm hàng duy nhất của nó. Đối với một tìm kiếm có ý nghĩa, bạn sẽ không sử dụng các chế độ xem này ...