在导出方案中,我正在创建具有用户+用户角色导出的电子表格,如下所示:
|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"]"
我要解决的问题是,当我将其放在电子表格中时,我需要知道起始行中的最大用户角色数。我可以在应用程序级别上将其放在两个不同的查询/请求中,但是我希望该列采用固定格式。