2016-06-29 51 views
1

嘗試創建一個函數,如果searchTerm存在於其中一列內的任何位置,則該函數將從表中返回多行。 (我是新來的Pos​​tgres。)錯誤: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'; 

我得到這個錯誤:

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

請記住始終提供您的Postgres版本和相關表格的確切表格定義。提示:'SELECT version();' –

回答

0

它應該是這樣的:

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; 

我使用的表類型返回完整行。這是安全的後備,因爲你沒有透露任何數據類型或表定義。

我也使用ILIKE使搜索不區分大小寫(只是猜測,你決定)。

這隻搜索一個credit_br。您的描述聽起來像是想要搜索所有列(anywhere inside one of the columns)。再次,大部分重要信息都缺失。一個非常快速和輕度污染的方法是將搜索轉換爲text整排的表達:

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

相關:

旁白:
不要混合使用如果可以避免的話,可以在Postgres中使用-case標識符。

不要引用功能的語言名稱。這是一個標識符。

+0

嗨Erwin,是不是開始需要結束?由於我得到這個錯誤http://pasteboard.co/22ZD5izR.jpg –

+0

@bluepiranha:LANGUAGE plpgsql需要'BEGIN'和'END',但LANGUAGE sql不能。您收到的錯誤表明您使用的是Postgres的舊版本,其中SQL函數不接受參數名稱。您可以在函數體中使用'$ 1'。 –