2017-05-08 7 views
2

IN()を使用しているwhere句でフィルタとして多値(カンマ区切り)パラメータを使用してこのpostgres関数に問題があります。IN()で多値パラメータを使用する

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

1つの文字列全体としてパラメータ値を処理し、特定の文字列(CSV)に分割していないようだ。

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; 

$$;


は、だから私は、関数を呼び出すとき。私が必要としているように行動させるにはどうすればいいですか?

+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 (string_to_array($1, ',')) 
GROUP BY company; 
$$; 

select * 
from company_sites_report('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 ($1) 
GROUP BY company; 
$$; 

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

またはプロシージャ内の配列にカンマ区切りの文字列を変換しますデリミタ文字を含む会社名を心配する必要はありません

+0

ニース1、感謝します! –

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) 
関連する問題