Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组中每个元素的SQL select语句_Sql_Postgresql_Stored Functions - Fatal编程技术网

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

数组中每个元素的SQL select语句,sql,postgresql,stored-functions,Sql,Postgresql,Stored Functions,我在服务器上有一个SQL表,它有两列,短名称和长名称,如下所示: Short | Long ________________ Max | Maximilian Tom | Thomas 我得到一个任意短名称数组,需要生成一个匹配长名称的数组。我知道如何使用多个select语句来实现这一点,但我认为最好输入一个给定短名称的列表,然后返回一个列表,这样我就可以最大限度地减少发送到服务器的请求。除了基本连接之外,我对SQL不是很在行,所以我希望有人能给我一些建议。语言可以是plpgsql或标

我在服务器上有一个SQL表,它有两列,短名称和长名称,如下所示:

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()
,但我会将其设置为一个返回函数(可以像表格一样使用)。一个
语言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;
如果确实要返回一个巨大的数组,可以使用:

CREATE FUNCTION get_long_names(short_names TEXT[])
  RETURNS text[]
as
$$
  select array(SELECT long
               FROM mytable 
               WHERE short = any(short_names));
$$
LANGUAGE sql;
使用
=any()
,但我会将其设置为一个set返回函数(可以像表格一样使用)。一个
语言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;
如果确实要返回一个巨大的数组,可以使用:

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;

未经测试,但类似的方法应该可以工作:

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;

看来它会成功的!非常感谢你,看起来它会成功的!谢谢你,我更喜欢这个答案,因为它可以让你找出哪个长名称属于哪个短名称。实际上,这里的数组返回的顺序与插入数组相同,所以你有链接。我更喜欢这个答案,因为它允许你找出哪个长名称属于哪个短名称。实际上,这里的数组返回的顺序与插入数组相同,所以你有链接。