根据派生列值查找记录

时间:2017-07-02 23:44:37

标签: plsql oracle11g

我们有一个员工类别系统,它将值封装在大约25列中。这些列表示我们的员工在我们的一个核心系统中可以使用的功能。

我们希望建立一个人可以

的过程
  • 提供员工列表,其中任何一个都可以属于任何类别
  • 他们表示他们希望员工拥有一个或多个“功能更改”

...并且代码将确定任何现有类别是否与列表中当前具有新功能的每个员工的功能相匹配。

到目前为止,我能想到的唯一方法是在请求中循环遍历员工列表的游标,并为每个人根据当前列值构建SELECT字符串,覆盖变更请求中的任何功能,然后动态运行并从我们的类别表中返回select以查看是否匹配。

我想知道是否有更好的方法?

我们数据的简化示例:

Categories table:

    Category Feature1 Feature2 Feature3
    Cat1     Yes      No       1
    Cat2     Yes      Yes      1
    Cat3     No       No       2

Employees table:

    EmployeeId Category
    Emp1       Cat1
    Emp2       Cat2

在上面的示例中,如果我们要求查看是否存在类别,其中Emp1可以保留其所有现有功能,但启用了Feature2(在本例中为“是”),则代码需要识别Cat2是一个合适的类别(如果现有和新功能不存在合适的类别,那么我们建议请求者需要要求创建一个新类别。)

1 个答案:

答案 0 :(得分:2)

您无需按需构建SQL。您可以执行此绑定变量和COALESE(如果您愿意,还可以使用NVL):

SELECT Category
FROM categories c1
JOIN employee e ON 1=1
JOIN categories c2 ON e.category = c2.category
WHERE e.employeeID = ?
  AND c1.feature1 = COALESCE(?, c2.feature1)
  AND c1.feature2 = COALESCE(?, c2.feature2)
  AND c1.feature3 = COALESCE(?, c2.feature3)

然后使用employeeId,new_feature1,new_feature2,new_feature3等作为绑定值。如果新值为NULL,则将使用旧值。