案例与Sql Server 2008中的Where条件

时间:2011-06-13 10:24:51

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

如何使用案例和哪里?我试过这些线,显示错误?是否可以使用将使用参数选择where条件的查询。

在这里,我想通过'姓名'和'类别',如果是,则它将使用类似于具有名称的opearator,如果'类别'然后它会选择LIKE类别。

 Select * 
  FROM  [tblAssetAccessory] assry
  WHERE 
  (CASE @Query
    WHEN 'Name' THEN assry.accessry_name like '%'+@Search+'%' END 
    WHEN 'Category' THEN assry.accessory_CategoryID IN 
        (SELECT asryCat.accessory_CategoryID FROM [Asset].tblAssetAccessory_Category asryCat 
             WHERE asryCat.accessory_Category LIKE '%'+@Search+'%' ) END )
          AND assry.company_ID=@company_ID
          AND assry.branch_ID=@branch_ID
          AND assry.division_ID=@division_ID
          AND assry.isDeleted=0 
          )

4 个答案:

答案 0 :(得分:4)

CASE是一个表达式 - 它必须返回一个值。至于SQL Server,至少到目前为止,谓词的结果不是值。

尝试使用更简单的AND / OR条件重写您的查询:

Select * 
FROM  [tblAssetAccessory] assry
WHERE
   (
       (
           @Query = 'Name' AND
           accessry_name like '%'+@Search+'%'
       )
       OR
       (
           @Query = 'Category' AND
           EXISTS (SELECT * from [Asset].tblAssetAccessory_Category asryCat
               where
                   asryCat.accessory_CategoryID = assry.accessory_CategoryID AND
                   asryCat.accessory_Category LIKE '%'+@Search+'%')
       )
   )
   AND
      company_ID=@company_ID
      branch_ID=@branch_ID
      division_ID=@division_ID
      isDeleted=0 

答案 1 :(得分:1)

使用或/和条件。我认为你当时不需要案例陈述。

WHERE (@Query = 'Name' AND assry.accessry_name like '%'+@Search+'%') OR (@Query = 'Category' AND (assry.accessory_CategoryID IN 
        (SELECT asryCat.accessory_CategoryID FROM [Asset].tblAssetAccessory_Category asryCat 
             WHERE asryCat.accessory_Category LIKE '%'+@Search+'%' ) )

答案 2 :(得分:1)

您也可以使用sp_executesql

创建查询字符串并执行它
declare @qrystr nvarchar(500)
set @qrystr = ' Select * 
  FROM  [tblAssetAccessory] assry
  WHERE '
  if @Query = 'Name'
   set @qrystr = @qrystr  + 'assry.accessry_name like ''%'+@Search+'%'' END'
  else 
    set @qrystr = @qrystr  + 'assry.accessory_CategoryID IN 
        (SELECT asryCat.accessory_CategoryID FROM [Asset].tblAssetAccessory_Category asryCat 
             WHERE asryCat.accessory_Category LIKE ''%'+@Search+'%'' ) END )
          AND assry.company_ID=@company_ID
          AND assry.branch_ID=@branch_ID
          AND assry.division_ID=@division_ID
          AND assry.isDeleted=0 
          )'

          exec sp_execute @qrystr

答案 3 :(得分:0)

在哪里可以获得建议的答案?如果没有,为什么不先尝试使用CASE测试条件,然后继续查询。请参阅以下代码:

CASE @Query
    WHEN 'Name' THEN 
    Select * 
    FROM  [tblAssetAccessory] assry
    WHERE assry.accessry_name like '%'+@Search+'%' 
    END 
    WHEN 'Category' THEN 
        Select * 
    FROM  [tblAssetAccessory] assry
    WHERE assry.accessory_CategoryID IN 
         (SELECT asryCat.accessory_CategoryID FROM [Asset].tblAssetAccessory_Category asryCat 
         WHERE asryCat.accessory_Category LIKE '%'+@Search+'%' ) END )
         AND assry.company_ID=@company_ID
         AND assry.branch_ID=@branch_ID
         AND assry.division_ID=@division_ID
         AND assry.isDeleted=0 
         )
    END