Sql 如何在ORACLE中生成计算列中的值的函数?

Sql 如何在ORACLE中生成计算列中的值的函数?,sql,database,oracle,Sql,Database,Oracle,这是我的甲骨文表。如您所见,列ID_角色是数字2的幂。第一个角色是2对0的幂,第二个角色是2对1的幂,最后一个角色是2对11的幂,等等。当某人只有一个角色时,这很容易,我可以生成CASE或解码函数。例如,如果ID_ROLE为2,则此人为“Director”。但问题是当某人有两个或两个以上的角色时。如果ID_ROLE为24(例如),则表示此人具有角色“Secretary”和“Controlor”(8+16),并应返回类似于“Secretary/Controlor”的文本 知道怎么做吗?这里有一个使

这是我的甲骨文表。如您所见,列ID_角色是数字2的幂。第一个角色是2对0的幂,第二个角色是2对1的幂,最后一个角色是2对11的幂,等等。当某人只有一个角色时,这很容易,我可以生成CASE或解码函数。例如,如果ID_ROLE为2,则此人为“Director”。但问题是当某人有两个或两个以上的角色时。如果ID_ROLE为24(例如),则表示此人具有角色“Secretary”和“Controlor”(8+16),并应返回类似于“Secretary/Controlor”的文本


知道怎么做吗?

这里有一个使用

  • 执行按位AND运算;及
  • 加入用斜杠分隔的角色名称(从11g开始提供)
其结果是输出:

SELECT LISTAGG(NAME_OF_ROLE, ' / ')
WITHIN GROUP (ORDER BY ID_ROLE) "ROLE_NAMES"
FROM ROLES
WHERE BITAND(ID_ROLE, 24) = ID_ROLE;
我使用的DDL:

+------------------------+
| ROLE_NAMES             |
+------------------------+
| Secretary / Controller |
+------------------------+
和我的测试数据:

CREATE TABLE  "ROLES" (
    "ID_ROLE" NUMBER NOT NULL ENABLE, 
    "NAME_OF_ROLE" VARCHAR2(4000), 
     CONSTRAINT "ROLES_PK" PRIMARY KEY ("ID_ROLE") USING INDEX ENABLE
);

Oracle是一个关系数据库。为什么不创建一个表,其中一个人与一个角色有多个关系?这个问题将为获取数字的第n位值提供答案。我支持Rene的评论——这不是关系数据库的设计方式。如果您在用户和角色之间添加了一个交集表,您还可以添加属性来描述这种关系,例如有效期。虽然我确实理解并且可能同意@Rene和David Aldridge的反对意见,我认为这是一种有趣的方法,并且确实消除了对联接表的需要。@RobbyCornelissen我不确定是否愿意将联接表交换为包含位and操作tbh的联接。
CREATE TABLE  "ROLES" (
    "ID_ROLE" NUMBER NOT NULL ENABLE, 
    "NAME_OF_ROLE" VARCHAR2(4000), 
     CONSTRAINT "ROLES_PK" PRIMARY KEY ("ID_ROLE") USING INDEX ENABLE
);
INSERT INTO ROLES (NAME_OF_ROLE, ID_ROLE) VALUES ('Manager', 1);
INSERT INTO ROLES (NAME_OF_ROLE, ID_ROLE) VALUES ('Director', 2);
INSERT INTO ROLES (NAME_OF_ROLE, ID_ROLE) VALUES ('Supervisor', 4);
INSERT INTO ROLES (NAME_OF_ROLE, ID_ROLE) VALUES ('Secretary', 8);
INSERT INTO ROLES (NAME_OF_ROLE, ID_ROLE) VALUES ('Controller', 16);
INSERT INTO ROLES (NAME_OF_ROLE, ID_ROLE) VALUES ('Boss', 2048);