SQL查询中的Venn操作

SQL查询中的Venn操作,sql,oracle,Sql,Oracle,我有一个表,其中列出了可以是管理员、开发人员,也可以是非管理员 EMP_ID IS_ADMIN IS_DEV 1 Y Y 2 Y N 3 N Y 4 N N EMP_ID是_ADMIN是_DEV 1年 2 Y N 3纽约 4 N N 我想写一个查询,这样当我请求 IS_ADMIN=Y返回1,2 IS_DEV=Y返回1,3 IS_DEV=Y,IS_

我有一个表,其中列出了可以是管理员、开发人员,也可以是非管理员

EMP_ID IS_ADMIN IS_DEV 1 Y Y 2 Y N 3 N Y 4 N N EMP_ID是_ADMIN是_DEV 1年 2 Y N 3纽约 4 N N 我想写一个查询,这样当我请求

  • IS_ADMIN=Y返回1,2
  • IS_DEV=Y返回1,3
  • IS_DEV=Y,IS_ADMIN=Y返回1,2,3
  • 是_DEV=N、是_ADMIN=N还是nothing返回4

  • 是否要将此登录合并到一个查询中?

    您可以将所有选项指定为参数,将null传递给您不关心的任何参数,并检查null作为查询条件。您的逻辑有点弯曲,因此必须针对每个组合进行精确编程:

    SELECT
      emp_id
    FROM
      emps
    WHERE
      (is_admin = 'Y' AND :isadmin = 'Y' AND :isdev is null)
      OR
      (is_dev = 'Y' AND :isdev = 'Y' AND :isadmin is null)
      OR
      (:isadmin = 'Y' AND :isdev = 'Y' AND (is_admin = 'Y' OR is_dev = 'Y'))
      OR
      (COALESCE(:isadmin, 'N') = 'N' AND COALESCE(:isdev, 'N') = 'N' AND is_admin = 'N' AND is_dev = 'N')
    
    您选择的调用语言将参数设置为“Y”、“N”或null(如果它没有意见),例如,对于您的案例1,在c#中:

    sqlCommand.Parameters["isadmin"].Value = "Y";
    sqlCommand.Parameters["isdev"].Value = DBNull.Value;
    using(var reader = sqlCommand.ExecuteReader()) ....
    

    我不确定你的逻辑在这里是否有意义。如果IS_DEV=Y或IS_ADMIN=Y应返回1,2,3,那么IS_DEV=N或IS_ADMIN=N如何仅返回4?它不应该返回2,3,4吗?PL/SQL是Oracle DBMS的过程语言。你在使用Oracle还是MySQL?我在使用Oracle。我已经为你修复了问题标签。