前置条件

有3个角色,系统管理员、租户管理员、普通用户查看广告。

系统管理员只能查询自己的广告

租户管理员可以查询自己租户和系统的广告

租户下的普通用户只能查询自己租户下的广告

方案

在表中添加一个字段tenantId。

如果系统管理员添加广告时置空,租户管理员添加广告设置为租户自己的id

系统管理员查看自己的广告时,条件过滤时只要tenantId is null 就可以查询出所要系统级的广告

租户管理员查询自己租户和系统的广告是过滤条件时,过滤条件只要  tenantId = ‘租户自己的ID’ or tenantId is null

租户下的普通用户只能查询自己租户下的广告时,过滤条件只要设置为 tenantId=‘普通用户的租户ID’

SELECT *
      FROM table
     WHERE 1 = 1
       AND (
           (:tenant IS NOT NULL AND (tenantid = '10002' or tenantid is null)) OR
           (:agent IS NOT NULL AND (tenantid = '10002')) OR
           (:admin IS NOT NULL AND (tenantid is null))
           )

不管PL/SQL可以拼接sql语句,oracle也提供拼接sql语句,根据你的角色拼接不同的查询条件如果tenant不为空,则拼接and后面的sql,其他以此类推。
而且此sql语句性能很好。不过可以进行不同角色查询的过滤,还可以支持其他场景拼接。