2017-05-08 68 views
2

我在使用IN()的where子句中使用多值(逗號分隔)參數作爲過濾器的postgres函數遇到問題。在IN中使用多值參數


CREATE FUNCTION company_sites_report(company_list text) 
    RETURNS TABLE(company text, num_suppliers BIGINT) 
LANGUAGE SQL 
AS $$ 

SELECT company, count(supplier_id) num_suppliers 
FROM MySitesTable 
WHERE company IN ($1) 
GROUP BY company; 

$$;

所以,當我調用該函數:

SELECT * 
FROM company_sites_report('Company1,Company2'); 

看來治療參數值作爲一個整體字符串,並將其拆分爲不特定的字符串(CSV)。我如何讓它按照我的需要行事?

+0

嘗試可變參數..或plpgslq和動態串 –

回答

2

您正在傳遞一個字符串,所以條件將其用作單個值。

您需要可以通過該公司的名稱作爲數組:

CREATE FUNCTION company_sites_report(company_list text[]) 
    RETURNS TABLE(company text, num_suppliers BIGINT) 
LANGUAGE SQL 
AS $$ 

SELECT company, count(supplier_id) num_suppliers 
FROM MySitesTable 
WHERE company = ANY ($1) 
GROUP BY company; 
$$; 

select * 
from company_sites_report(array['Company1', 'Company2']); 

或分隔字符串轉換逗號到一個數組裏面程序:

CREATE FUNCTION company_sites_report(company_list text) 
    RETURNS TABLE(company text, num_suppliers BIGINT) 
LANGUAGE SQL 
AS $$ 

SELECT company, count(supplier_id) num_suppliers 
FROM MySitesTable 
WHERE company = ANY (string_to_array($1, ',')) 
GROUP BY company; 
$$; 

select * 
from company_sites_report('Company1,Company2'); 

我寧願先解決方案您不必擔心包含分隔符的公司名稱

+0

尼斯之一,非常感謝! –

4

考慮usingVARIADIC,例如:

t=# CREATE FUNCTION f1(a variadic text[]) 
    RETURNS TABLE(t text) 
LANGUAGE SQL 
AS $$ 

SELECT tablename::text 
FROM pg_tables 
WHERE tablename = ANY ($1) 
; 
$$; 

例如:

t=# select * from f1('so4','s111','so2'); 
    t 
------ 
so2 
so4 
s111 
(3 rows) 
相關問題