他们在使用 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;