sql - 如何在ORACLE中创建函数来计算列中的值?

标签 sql database oracle

 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),并且应返回类似“秘书/控制者”的文本。

知道如何做到这一点吗?

最佳答案

这是一个使用的解决方案

  • BITAND执行按位与运算;和
  • LISTAGG连接由斜线分隔的角色名称(从 11g 开始可用)
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/

相关文章:

javascript - 如何在 Objection/Knex 中使用引用而不是文字字符串值查询 .where()

mysql - SQL:每个饮酒者经常光顾的酒吧(使用 NOT EXISTS)

mysql - 更新大表中的查询

php - Libresolv 对 Alpine linux 的依赖

sql - 为什么当我使用临时表时,oracle 中的查询需要更长的时间?

oracle - Oracle 过程是否继承其创建者的特权?

php - SQLSTATE[23000] : Integrity constraint violation: 1452 Cannot add or update a child row:a foreign key

sql - Postgres 中 JSON 查询中的 OR 子句

mysql - 如何使用 MySQL 命令行客户端安装 .sql 文件

sql - 描述表结构