2016-06-29 17 views
1

Versuchen, eine Funktion zu erstellen, die mehrere Zeilen aus einer Tabelle zurückgibt, wenn eine searchTerm irgendwo in einer der Spalten vorhanden ist. (Ich bin neu in Postgres.)Fehler: Spalte existiert nicht in PostgreSQL

CREATE OR REPLACE FUNCTION dts_getProjects(searchTerm TEXT) RETURNS SETOF project 
AS $$ 
SELECT credit_br AS Branch, status FROM job_project 
WHERE credit_br LIKE '%'||searchTerm||'%' 
$$ 
language 'sql'; 

ich diesen Fehler:

ERROR: column "searchTerm" does not exist 
LINE 3: ...status FROM job_project WHERE credit_br LIKE '%'||searchTerm||'... 
+0

Bitte denken Sie daran, immer Ihre Version von Postgres und die genaue Tabellendefinition relevanter Tabellen anzugeben. Hinweis: 'SELECT version();' –

Antwort

0

Es sollte so funktionieren:

CREATE OR REPLACE FUNCTION dts_get_projects(_search_term text) 
    RETURNS SETOF job_project AS 
$func$ 
SELECT j.* 
FROM job_project j 
WHERE j.credit_br ILIKE '%' || _search_term || '%' 
$func$ LANGUAGE sql; 

Ich bin mit dem Tabellentyp ganze Zeilen zurückgeben . Das ist der sichere Fallback, da Sie keine Datentypen oder Tabellendefinitionen offengelegt haben.

Ich verwende auch ILIKE, um die Suche case-insensitive (nur eine Schätzung, Sie entscheiden).

Dies sucht nur die eine Spalte credit_br. Ihre Beschreibung klingt, als ob Sie alle Spalten durchsuchen möchten (anywhere inside one of the columns). Auch hier fehlen die meisten wichtigen Informationen. Eine sehr schnelle und leicht schmutzig Weg wäre, die ganze Reihe Ausdruck text umgewandelt suchen:

... 
WHERE j::text ILIKE '%' || _search_term || '%'; 
... 

Verwandte:

Asides:
nicht gemischt verwenden -case-Bezeichner in Postgres, wenn Sie es vermeiden können.

Sie den Namen der Sprache der Funktionen nicht zitieren. Es ist eine Kennung.

+0

Hallo Erwin, ist nicht begin end erforderlich? Da ich diesen Fehler bekomme http://pasteboard.co/22ZD5izR.jpg –

+0

@ bluepiranha: 'BEGIN' und' END' sind erforderlich für 'SPLAGE plpgsql', aber nicht für' LANGUAGE sql'. Der Fehler, den Sie erhalten, zeigt an, dass Sie sich in einer sehr alten Version von Postgres befinden, in der SQL-Funktionen keine Parameternamen akzeptieren. Sie können stattdessen '$ 1' im Funktionskörper verwenden. –

Verwandte Themen