案例中的TSql案例

时间:2012-10-09 02:21:16

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

我正在尝试使用案例中的案例在tsql中执行select语句。首先是基于SearchField的内容。接下来我需要基于SearchOper来完成它。

    declare @searchField varchar(50)  
    declare @searchString varchar(50)
    declare @searchOper varchar(50)

    case @searchField
     when 'CompanyName' then
        case @searchOper
          when 'eq' then
            select * from tbl1 where CompanyName = @searchString
         when 'ne' then 
           select * from tbl1 where CompanyName <> @searchString
         end
     when 'StoreNum' then
        case @searchOper
          when 'eq' then
             select * from tbl1 where StoreNum = @searchString
          when  'ne' then
             select * from tbl1 where StoreNum <> @searchString
        end 
     end 

注意我要做的是在case语句中做一个select。

我收到一条消息,说关键字'case'附近的语法不正确。

4 个答案:

答案 0 :(得分:5)

根据您的示例,您可能希望使用IF语句(以下是ELSE的示例,但您也可以多次使用IF和ELSE IF):

declare @searchField varchar(50)  
declare @searchString varchar(50)
declare @searchOper varchar(50)

IF @searchField='CompanyName'
BEGIN
    IF @searchOper='eq'
    BEGIN
        select * from tbl1 where CompanyName = @searchString
    END
    ELSE
    BEGIN
        select * from tbl1 where CompanyName <> @searchString
    END
END
ELSE 
BEGIN
    IF @searchOper='eq'
    BEGIN
        select * from tbl1 where StoreNum = @searchString
    END
    ELSE
        select * from tbl1 where StoreNum <> @searchString
    END
END

CASE非常相似,但更适用于内联语句(即SELECT CASE 1 = 1 THEN'a'ELSE'b'END)。

答案 1 :(得分:1)

declare @searchField varchar(50)  
declare @searchString varchar(50)
declare @searchOper varchar(50)

 select *
 from tbl1
 where (@searchField <> 'companyName'
       or
       @searchOper = 'eq' and CompanyName = @searchString
       or
       @searchOper = 'ne' and CompanyName <> @searchString)
   AND (@searchField <> 'StoreNum'
       or
       @searchOper = 'eq' and CompanyName = @searchString
       or
       @searchOper = 'ne' and CompanyName <> @searchString)
 option (recompile)

这是编写它的一种方式,它应该执行正常。您所拥有的是www.sommarskog.se/dyn-search.html的变体,但OPTION (RECOMPILE)每次仍应生成最佳计划。

答案 2 :(得分:0)

declare @searchField varchar(50)  
declare @searchString varchar(50)
declare @searchOper varchar(50)

SELECT
    (case @searchField
     when 'CompanyName' then
        (case @searchOper
          when 'eq' then
            (select * from tbl1 where CompanyName = @searchString)
         when 'ne' then 
           (select * from tbl1 where CompanyName <> @searchString)
         end
         )
     when 'StoreNum' then
        (case @searchOper
          when 'eq' then
             (select * from tbl1 where StoreNum = @searchString)
          when  'ne' then
            ( select * from tbl1 where StoreNum <> @searchString)
        end 
        )
     end 
) a

我懒得建立tbl1,把它改成getdate而不是

declare @searchField varchar(50)  
declare @searchString varchar(50)
declare @searchOper varchar(50)

SET @searchField = 'CompanyName'
SET @searchOper = 'eq'
SELECT
    (case @searchField
     when 'CompanyName' then
        (case @searchOper
          when 'eq' then
            (select getdate())
         when 'ne' then 
           (select getdate())
         end
         )
     when 'StoreNum' then
        (case @searchOper
          when 'eq' then
             (select getdate())
          when  'ne' then
            ( select getdate())
        end 
        )
     end 
) a

答案 3 :(得分:0)

根据MSDN,

“CASE表达式不能用于控制Transact-SQL语句,语句块,用户定义函数和存储过程的执行流程。”

参考Here