如果条件在sql过程中的case语句中写入

时间:2015-01-22 09:18:37

标签: sql sql-server sql-server-2008

我在sql中有以下数据

Table with data

我想以这样的方式编写查询:我有John Smith中间初始M的数据,当选择的许可扇区字段值不等于非前线时,它应该显示john smith M和许可扇区值非前线,门,安全,私人调查。 只有当角色属性为空时,角色包含非前线或前面,它才会显示具有所选值角色的数据。

当我使用下拉菜单从前端传递价值到许可证扇区时,我的下拉列表不包含非前线。它只是在数据库中 而角色是另一个具有非前线和前线价值的下拉列表。

所以我想按照以下方式加入

如果从下拉列表中选择的许可证扇区值是门安全性且角色值为空,则输出约翰史密斯M

1102551085816250    Smith       John    M   12/15/1987  Non-Frontline   Non-Frontline                   
1102941363382950    Smith       John    M   12/15/1987  Door Security   Frontline                   

如果从下拉列表中选择的许可证扇区值是门安全性,则从下拉列表中选择的角色值是前线:

 1102941363382950   Smith   John    M   12/15/1987  Door Security   Frontline

如果从下拉列表中选择的许可证扇区值是门安全性 从下拉列表中选择的角色值是非前线,然后它不应显示任何数据,因为没有这样的组合

我按照以下方式写了程序

SELECT Licence_Number,
       Family_Name,
       First_Name,
       Middle_Initial,
       Date_of_birth,
       Licence_sector,
       [Role],
       [Expiry_date],
       [Status],
       Status_as_of_date,
       Status_explanation,
       Additional_condition
FROM   Public_Register
WHERE  Family_Name = @Familyname
       AND [Expiry_date] > Getdate()
       AND ( CASE
               WHEN @Forname IS NULL THEN 'A'
               ELSE First_Name
             END LIKE Isnull('%' + @Forname + '%', 'A')
             AND CASE
                   WHEN @MiddleInit IS NULL THEN 'A'
                   ELSE Middle_Initial
                 END = Isnull(@MiddleInit, 'A')
             AND CASE
                   WHEN @DOB IS NULL THEN ''
                   ELSE Date_of_birth
                 END = Isnull(@DOB, '')
             AND ( CASE
                     WHEN @Role IS NULL THEN ''
                     ELSE [Role]
                   END = Isnull(@Role, '') )
              OR [Role] = 'Non-Frontline' )
       AND CASE
             WHEN @Sector IS NULL THEN ''
             ELSE Licence_sector
           END = Isnull(@Sector, '') 

请帮助我如何修改程序以获得所需的输出。

1 个答案:

答案 0 :(得分:0)

尝试修改此行:

    AND (CASE WHEN @Role IS NULL THEN TRUE ELSE ( [Role] = @Role ) END)