ID_ROLE NAME_OF_ROLE
---------- -------------
1 Manager
2 Director
4 Supervisor
8 Secretary
16 Controlor
...
2048 Boss
这是我的 ORACLE 表。如您所见,列 ID_ROLE 是数字 2 的幂。第一个角色是 2 的 0 次方,第二个角色是 2 的 1 次方,最后一个角色是 2 的 11 次方,依此类推。这很容易,当有人只有一个作用,我可以制作CASE或DECODE函数。例如,如果 ID_ROLE 为 2,则该人是“总监”。但问题是当某人担任两个或多个角色时。例如,如果 ID_ROLE 为 24,则表示此人具有“秘书”和“控制者”角色 (8 + 16),并且应返回类似“秘书/控制者”的文本。
知道如何做到这一点吗?
最佳答案
这是一个使用的解决方案
SELECT LISTAGG(NAME_OF_ROLE, ' / ')
WITHIN GROUP (ORDER BY ID_ROLE) "ROLE_NAMES"
FROM ROLES
WHERE BITAND(ID_ROLE, 24) = ID_ROLE;
这会导致输出:
+------------------------+
| ROLE_NAMES |
+------------------------+
| Secretary / Controller |
+------------------------+
我使用的DDL:
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);
关于sql - 如何在ORACLE中创建函数来计算列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40015403/