Plsql 基于派生列值查找记录

Plsql 基于派生列值查找记录,plsql,oracle11g,Plsql,Oracle11g,我们有一个员工类别系统,它将值封装在大约25列中。这些列显示了我们的一个核心系统中可供员工使用的功能 我们想建立一个过程,通过这个过程某人可以 提供一份员工名单,其中任何一位员工都可以属于任何类别 它们表示希望员工进行的一项或多项“功能更改” …代码将确定是否有任何现有类别与列表中每个员工当前拥有的功能匹配,并启用新功能 到目前为止,我能想到的唯一方法是在请求中循环遍历员工列表的游标,并为每个员工基于其当前列值构建一个SELECT字符串,覆盖变更请求中的任何功能,然后动态运行并从我们的分类表返回

我们有一个员工类别系统,它将值封装在大约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可以保留其所有现有功能,但在本例中启用了功能2“是”,那么代码需要确定Cat2是一个合适的类别,如果现有和新功能不存在合适的类别,然后我们建议请求者需要请求创建一个新类别。

您不需要按需构建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,则将使用旧值。

您不需要按需构建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等作为绑定值。如果新值为空,则将使用旧值。

我想你可能刚刚震撼了我的世界。需要确认,但我有信心我会回来标记这个作为答案。问题:是否有第二个“关于”的论点加入到c1中?我无法从概念上实现这一点。是的,在1=1或Oracle下应该有一个JOIN employee,您可以使用CROSS JOIN employee。基本上它是这样工作的:取当前员工并找到他的类别c2,然后对所有可用类别进行交叉联接。然后过滤掉那些功能与新绑定变量类别或旧绑定变量类别(如果前者为空)不匹配的类别。感谢@fhossfel-我自己碰巧遇到了on 1=1解决方案。是否要编辑答案以包含此加入?一旦完成,我可以把它标记为被接受的答案。我想你可能已经震撼了我的世界。需要确认,但我有信心我会回来标记这个作为答案。问题:是否有第二个“关于”的论点加入到c1中?我无法从概念上实现这一点。是的,在1=1或Oracle下应该有一个JOIN employee,您可以使用CROSS JOIN employee。基本上它是这样工作的:取当前员工并找到他的类别c2,然后对所有可用类别进行交叉联接。然后过滤掉那些功能与新绑定变量类别或旧绑定变量类别(如果前者为空)不匹配的类别。感谢@fhossfel-我自己碰巧遇到了on 1=1解决方案。是否要编辑答案以包含此加入?完成后,我可以将其标记为已接受的答案。