他们在使用 select 语句时有没有办法使用 postgresql 会话变量
Is they any way to use postgresql session variable while using select statement
我有一个特定的请求,如果用户有多个政策,我只反映一次用户,我需要一种方法来将重复的字段留空,并且只显示一次真实值,如下所示:
CREATE OR REPLACE FUNCTION get_user_name(user_pk NUMERIC)
RETURNS text AS
$body$
DECLARE users_array NUMERIC[];
BEGIN
IF (select array_position(users_array, user_pk)) THEN
return ' ';
ELSE
users_array = array_append(users_array, user_pk);
return (SELECT first_name || ' ' || last_name FROM user where id=user_pk);
END IF;
END
$body$
LANGUAGE plpgsql;
SELECT
row_number() OVER () as id,
get_user_name(user_pk := users.id) as client,
policy.policy as policy,
FROM policies_policy as policy
INNER JOIN user users
order by users.id;
我需要一种方法来避免每次函数调用时都重新声明users_array
假设右手边的图片是你想要的,就不需要函数了:
SELECT case when
row_number() OVER (partition by u.id) = 1 then concat_ws(' ', u.first_name, u.last_name)
end as as name,
p.policy
FROM policies_policy as policy
JOIN "user" u on u.id = policy.user_pk
order by u.id;
或者,简单地在逗号分隔列表中收集每个用户的所有策略:
SELECT u.id,
string_agg(p.policy::text, ',') as policies
FROM policies_policy as policy
JOIN "user" u on u.id = policy.user_pk
group by u.id
order by u.id;
我有一个特定的请求,如果用户有多个政策,我只反映一次用户,我需要一种方法来将重复的字段留空,并且只显示一次真实值,如下所示:
CREATE OR REPLACE FUNCTION get_user_name(user_pk NUMERIC)
RETURNS text AS
$body$
DECLARE users_array NUMERIC[];
BEGIN
IF (select array_position(users_array, user_pk)) THEN
return ' ';
ELSE
users_array = array_append(users_array, user_pk);
return (SELECT first_name || ' ' || last_name FROM user where id=user_pk);
END IF;
END
$body$
LANGUAGE plpgsql;
SELECT
row_number() OVER () as id,
get_user_name(user_pk := users.id) as client,
policy.policy as policy,
FROM policies_policy as policy
INNER JOIN user users
order by users.id;
我需要一种方法来避免每次函数调用时都重新声明users_array
假设右手边的图片是你想要的,就不需要函数了:
SELECT case when
row_number() OVER (partition by u.id) = 1 then concat_ws(' ', u.first_name, u.last_name)
end as as name,
p.policy
FROM policies_policy as policy
JOIN "user" u on u.id = policy.user_pk
order by u.id;
或者,简单地在逗号分隔列表中收集每个用户的所有策略:
SELECT u.id,
string_agg(p.policy::text, ',') as policies
FROM policies_policy as policy
JOIN "user" u on u.id = policy.user_pk
group by u.id
order by u.id;