SQL select 数组中每个元素的语句

SQL select statement for every element in an array

我在服务器上有一个 SQL table,有两列,short_names 和 long_names,像这样:

Short | Long
________________
Max   | Maximilian
Tom   | Thomas

我得到了一个任意的短名称数组,需要生成一个由它们匹配的长名称组成的数组。我知道如何使用多个 select 语句来执行此操作,但我认为输入给定短名称的列表并接收回列表会更好,这样我可以最大限度地减少发送到服务器的请求。除了基本的连接之外,我对 SQL 不太了解,所以希望有人能给我一些指示。语言可以是 plpgsql 或标准 sql.

我想代码可能是这样的:

CREATE FUNCTION get_long_names(short_names TEXT[])
RETURNS TEXT[] AS
$$
BEGIN
    -- For every element in short_names
    -- SELECT long FROM mytable WHERE short == element
    -- Put whatever is selected in array that is being returned
END
$$
LANGUAGE plpgsql;

但我不确定在中间放什么!非常感谢任何帮助。

使用 =any(),但我会将其设置为 returning 函数(可以像 table 一样使用)。 language sql 函数就够了,不需要 PL/pgSQL

CREATE FUNCTION get_long_names(short_names TEXT[])
  RETURNS table(long_name text, short_name)
as
$$
  SELECT long, short
  FROM mytable 
  WHERE short = any(short_names);
$$
LANGUAGE sql;

如果你真的想要return一个巨大的数组,你可以使用:

CREATE FUNCTION get_long_names(short_names TEXT[])
  RETURNS text[]
as
$$
  select array(SELECT long
               FROM mytable 
               WHERE short = any(short_names));
$$
LANGUAGE sql;

未测试,但像这样的东西应该可以工作:

CREATE FUNCTION get_long_names(short_names TEXT[])
RETURNS TEXT[] AS
$$
BEGIN
    -- For every element in short_names
    -- SELECT long FROM mytable WHERE short == element
    -- Put whatever is selected in array that is being returned
    return(select array_agg(long order by o) 
    from unnest(short_names) with ordinality t(x,o) 
    left join mytable on short=x);    
END
$$
LANGUAGE plpgsql;