使用顺序计数器创建动态列

时间:2019-05-21 14:44:57

标签: sql postgresql

在导出方案中,我正在创建具有用户+用户角色导出的电子表格,如下所示:

|User Name  |Role_1  |Role_2     |Role_3  |
|superuser  |somerole|anotherrole|goodrole|
|anotheruser|somerole|goodrole   |        |

创建的“参差不齐”角色是从1到x分配的所有角色的顺序编号(而不是总体角色的数量)。

这是一个简化的示例:

https://www.db-fiddle.com/f/7ez4CyVxjc8ZRjTnfLGPHH/5

CREATE TABLE users (
    user_id INT,
    name TEXT
);

CREATE TABLE user_roles (
    user_id INT,
    role_id INT
);

CREATE TABLE roles (
    role_id INT,
    name TEXT
);

INSERT INTO users (user_id, name) VALUES (1, 'superuser'), (2, 'anotherusers');

INSERT INTO roles (role_id, name) VALUES (1, 'somerole'), (2, 'anotherrole'), (3, 'goodrole');

INSERT INTO user_roles (user_id, role_id) VALUES (1,1),(1,2),(1,3), (2,1),(2,3);

具有一个JSON字段的当前方法:

SELECT * FROM users
LEFT JOIN LATERAL (
  SELECT json_agg(roles.name ORDER BY roles.role_id ASC) as roles 
  FROM user_roles
  INNER JOIN roles ON user_roles.role_id=roles.role_id
  WHERE user_roles.user_id=users.user_id
) roles ON True;

当前,我将所有角色放在JSON字段中,并在应用程序级别将其解压缩。但是,我想在查询级别上实现参差不齐的对齐格式。 PostgreSQL查询魔术或通过简化(plpgsql)函数是否可以实现?

对我来说,另一个可接受的结果是使用每行中包含的所有列填充JSON对象。缺少值将为空。

所以不是

1   "superuser" "["somerole", "anotherrole", "goodrole"]"
2   "anotherusers"  "["somerole", "goodrole"]"

它可能产生:

1   "superuser" "["somerole", "anotherrole", "goodrole"]"
2   "anotherusers"  "["somerole", "goodrole", "null"]"

我要解决的问题是,当我将其放在电子表格中时,我需要知道起始行中的最大用户角色数。我可以在应用程序级别上将其放在两个不同的查询/请求中,但是我希望该列采用固定格式。

0 个答案:

没有答案