CASE语句中'case','when'和'end'附近的语法不正确

时间:2014-05-26 22:43:07

标签: sql sql-server-2012 logic sql-function

我的案例陈述中遇到了错误。现在我在NorthWind DB中测试它,然后在我参与的项目中使用它。 我知道我应该使用IF / ELSE,它适用于IF / ELSE,唯一的问题是我必须在函数中执行此操作而不使用存储过程。 根据我的理解,我在使用tablevalued函数时必须使用case语句,因为函数只能包含一个语句,因此需要使用一个case并且我被告知我使用IF / ELSE做的是函数不允许这种逻辑......

我将与@PreAQ一起传递一个ID,它只会返回基于过滤器的记录,这些过滤器将类似于下面所示,但有多个LIKES。

declare @PreAQ int
set @PreAQ = 0

case 
when @PreAQ = 0
    then
        (select * from Contacts where CompanyName like 'An%')
when @PreAQ = 1 
    then 
        (select * from Contacts where ContactTitle like 'S%')
end 

抛出的错误是

  

第15行,第1行,第7行   关键字' case'附近的语法不正确。

     

第15行,第11行,第1行,第11行   关键字'当'。

附近的语法不正确      

Msg 102,Level 15,State 1,Line 14   ' end'附近的语法不正确。

我也试过......

case @PreAQ
when  = 0
    then...

然后我得到了同样的错误

修改

这类似于我的功能在工作中所做的事情(除了过滤器不同和表格,但这仍然使用NorthWind作为测试数据库,注意如何取决于' @PreAQ& #39;数字,我需要它运行声明。我试图这样做......

declare @PreAQ int
set @PreAQ = 0

case
when @PreAq 0
    then
(select * from [Contacts]
where (CompanyName like 'An%' 
or CompanyName like 'B%'
or CompanyName like 'Ch%'
or CompanyName like 'De%'
or CompanyName like 'F%'))

 when @PreAQ 1
then
 (select * from [Contacts]
 where (CompanyName like 'Wa%' 
or CompanyName like 'Be%'
or CompanyName like 'Y%'
or CompanyName like 'DeF%'
or CompanyName like 'Fa%'
or CompanyName like 'Me%'
or CompanyName like 'Ma%'))
 end

4 个答案:

答案 0 :(得分:0)

如果要创建内联表值函数,可以使用以下内容:

create function dbo.ufn_SomeFunction(@PreAQ int)
  returns table
return 
(select * from Contacts
  where (case when @PreAQ = 0 then CompanyName else ContactTitle end)
     LIKE (case when @PreAQ = 0 then 'An%' else 'S%' end) )

请注意,您将拥有表/聚簇索引扫描。

答案 1 :(得分:0)

如果您的SQL语句变化很大,您可能需要使用动态SQL,并使用SP_EXECUTESQL执行。请参阅此SO问题以获取示例:Dynamic SQL Server stored procedure

答案 2 :(得分:0)

这应该可行,但我同意动态SQL是一种更好的方法。

    declare @PreAQ int
    set @PreAQ = 1

    select *
    from Contacts
    where (
            CompanyName like case @PreAQ
            when 0 then 'An%'
            end
         or ContactTitle like case @PreAQ
            when 1 then 'S%'
            end
          )

答案 3 :(得分:0)

在SQLServer的TSQL中,CASE不是用于控制执行哪段代码的编程构造,而是始终返回单个数据值的expression

尝试IF...ELSE

if @PreAQ = 0
   select * from Contacts where CompanyName like 'An%'
else if @PreAQ = 1
   select * from Contacts where ContactTitle like 'S%'