Ако оставим настрана вашия непосредствен проблем с цитирането (беше разгледан правилно от Джеф), функцията може да бъде много по-опростена и по-бърза по този начин:
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$;
Основни точки:
-
Вашата функция все още беше повредена. Препратки към
movie_makers.title
иmovie_makers.ncrew
нямаше да работи по този начин. Поправих го. -
Използвайте
RETURN QUERY
вместо примката. По този начин не е необходимо да използваме или дори да декларираме каквито и да било променливи. Вижте: -
По желание използвайте оператора за съвпадение на регулярен израз
~*
без значение за главни и малки букви . (По-просто, не по-бързо.)Така или иначе, може да искате да избегнете специални знаци. Вижте:
Настрана:едва ли има смисъл да филтрирате изглед, който вече избира „Боен клуб“ като единствен ред. За смислено търсене не бихте използвали тези изгледи ...