Abgesehen von Ihrem unmittelbaren Zitierproblem (wurde von Jeff richtig angesprochen), kann die Funktion so viel einfacher und schneller sein:
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$;
Wichtige Punkte:
-
Ihre Funktion war immer noch unterbrochen. Verweise auf
movie_makers.title
undmovie_makers.ncrew
würde so nicht funktionieren. Ich habe es behoben. -
Verwenden Sie
RETURN QUERY
statt Schleife. Auf diese Weise müssen wir auch überhaupt keine Variablen verwenden oder gar deklarieren. Siehe: -
Verwenden Sie optional den Übereinstimmungsoperator für reguläre Ausdrücke ohne Berücksichtigung der Groß-/Kleinschreibung
~*
. (Einfacher, nicht schneller.)In jedem Fall möchten Sie möglicherweise Sonderzeichen maskieren. Siehe:
Abgesehen davon:Es macht kaum Sinn, nach einer Ansicht zu filtern, die bereits "Fight Club" als einzige Zeile auswählt. Für eine sinnvolle Suche würden Sie diese Ansichten nicht verwenden ...