2016-06-29 4 views
1

Vous essayez de créer une fonction qui retournera plusieurs lignes d'une table si searchTerm existe n'importe où dans l'une des colonnes. (Je suis nouveau à Postgres.)Erreur: la colonne n'existe pas dans 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'; 

Je reçois cette erreur:

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

N'oubliez pas de toujours indiquer votre version de Postgres et la définition exacte des tables correspondantes. Astuce: 'SELECT version();' –

Répondre

0

Il devrait fonctionner comme ceci:

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; 

J'utilise le type de table pour retourner les lignes entières . C'est la solution de repli sûre puisque vous n'avez divulgué aucun type de données ou définition de table.

J'utilise également ILIKE pour rendre la recherche insensible à la casse (juste une estimation, vous décidez).

Ceci recherche uniquement la colonne credit_br. Votre description semble vouloir que vous cherchiez toutes les colonnes (anywhere inside one of the columns). Encore une fois, la plupart des informations essentielles manquent. Un très rapide et de manière légèrement sale serait de rechercher toute l'expression de la ligne convertie en text:

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

connexes:

apartés:
Ne pas utiliser mixte -case identifiants dans Postgres si vous pouvez l'éviter.

Ne pas citer le nom de la langue des fonctions. C'est un identifiant.

+0

Salut Erwin, n'est pas commencer fin requis? Puisque je reçois cette erreur http://pasteboard.co/22ZD5izR.jpg –

+0

@bluepiranha: 'BEGIN' et' END' sont requis pour 'LANGUAGE plpgsql', mais pas pour' LANGUAGE sql'. L'erreur que vous obtenez indique que vous êtes sur une version très ancienne de Postgres, où les fonctions SQL n'acceptaient pas les noms de paramètres. Vous pouvez utiliser '$ 1' dans le corps de la fonction à la place. –