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;
我在服务器上有一个 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;