如何修复我的 postgres 函数语法以适应用户参数

How to fix my postgres function syntax to fit a user parameter

我正在尝试制作一个 postgreql 函数,当我传递一个接受参数的 select 语句时,我对使用哪种语法格式有点困惑(这个参数可以是一个字符串或字符串列表)

这是我之前使用的原始 select 查询,placeholders 作为我的参数。这个 select 对我来说非常有用!

SELECT DISTINCT ON (symbol) symbol,
                next_dividend_date, ex_dividend_date
           FROM api.security_stats 
           WHERE api.security_stats.symbol 
           IN ({placeholders}) 
           ORDER BY symbol, date desc;
   

问题是当我尝试将上面的转换为可用函数时,用户可以在其中输入函数的参数。但是我无法使用语法。另外,psql documentation 中有很多函数的语法示例。我不确定我的情况应该使用哪一个?

CREATE FUNCTION dividend(stocks char)
RETURNS TABLE(symbol char, next_dividend_date date, ex_dividend_date date) AS $$
    SELECT DISTINCT ON (symbol) symbol, next_dividend_date, ex_dividend_date
                                                FROM api.security_stats 
                                                WHERE api.security_stats.symbol 
                                                IN ({stocks}) ORDER BY symbol, date desc) 
                                                $$ LANGUAGE SQL;

我正在尝试允许用户客户端输入参数 stocks

感谢您的帮助!

我想你想要这样的东西:

create function dividend(p_stocks char)
    returns table(symbol char, next_dividend_date date, ex_dividend_date date) 
as $$
    select distinct on (symbol) symbol, next_dividend_date, ex_dividend_date
    from api.security_stats 
    where api.security_stats.symbol = any(string_to_array(, ','))
    order by symbol, date desc 
$$ language sql;

那是 table-返回 SQL 函数;您可以使用位置符号 </code>.</p> 来引用输入参数 <p>在你的问题的两行之间,我知道参数是一个逗号分隔的字符串,所以我添加了一个额外的步骤来将它解析为一个数组,然后可以使用运算符 <code>any 进行搜索。

或者,如果您想将输入作为数组传递:

create function dividend(p_stocks text[])
    returns table(symbol char, next_dividend_date date, ex_dividend_date date) 
as $$
    select distinct on (symbol) symbol, next_dividend_date, ex_dividend_date
    from api.security_stats 
    where api.security_stats.symbol = any()
    order by symbol, date desc 
$$ language sql;