2015-04-07 183 views
2

查询返回全部或部分位值在我的数据库中,我有一个雇员表,其中包含一个名为EmployeeType的类型位列。我有一个网站,基于此显示员工的各种报告。通过参数

一份报告应该包括EmployeeType=1,另一份EmployeeType=0,第三份报告应该包括所有员工,而不管他们的EmployeeType。

我希望能够使用一个存储过程并传递一个EmployeeType变量。我想我可以做到以下几点,并传递0,1,2(EmployeeType1为0,1 EmployeeType0为1,所有EmployeeTypes为2)。

WHERE (Employee.EmployeeType <> @EmployeeType) 

但是,当我通过0或1以外的任何东西时,我只是返回EmployeeType = 0。

我猜这是因为2是无效的位类型。我想知道是否有办法我可以做我在找的东西,或者如果我唯一的选择是将EmployeeType更改为诸如int之类的东西,或者创建两个单独的存储过程(其中一个具有上面列出的WHERE子句和一个没有它)。

回答

1

您可以用case语句实现这一点:

where Employee.EmployeeType = case @EmployeeType 
           when 0 then 1 
           when 1 then 0 
           else Employee.EmployeeType end 

看看这个sql fiddle的工作示例。

作为一个侧面说明,你说0 for EmployeeType 1, 1 for EmployeeType 0, and 2 for all EmployeeTypes看起来更直观,使这个1,则1和0,那么0然后,您可以缩短你的声明是这样的:

where Employee.EmployeeType = case when @EmployeeType != 2 
            then @EmployeeType 
            else Employee.EmployeeType end 
+0

如果你看看你上面我会看到EmployeeType为0的EmployeeType为0的原因,因为我没有使用= =运算符,而是使用<>。你的两个例子都没有工作。使用您在此处列出的内容时,我将EmployeeType = 1传递给变量,而不是所有员工,而不管类型。 – aantiix

+0

@ doby48你可以修改我提供的sql小提琴来复制你的问题吗?它在小提琴中运作良好。 – paqogomez

+0

此外,我认为你在这里滥用位类型。当你有第三类员工时会发生什么?通常参考表用于这种类型的问题。案例陈述在大多数情况下仍然适用。 – paqogomez