在SQL查询中的Venn操作

时间:2017-06-28 17:34:34

标签: sql oracle

我有一张表,其中包含可以是admin,dev,both或者

的员工列表
EMP_ID  IS_ADMIN    IS_DEV
    1       Y         Y
    2       Y         N
    3       N         Y
    4       N         N

我想写一个查询,以便在我请求时

  1. IS_ADMIN = Y返回1,2
  2. IS_DEV = Y返回1,3
  3. IS_DEV = Y,IS_ADMIN = Y返回1,2,3
  4. IS_DEV = N,IS_ADMIN = N或无任何返回4
  5. 是否有将此登录信息合并到一个查询中?

1 个答案:

答案 0 :(得分:0)

将所有选项指定为参数,将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。在c#中为您的案例1:

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