【发布时间】:2014-07-15 17:27:38
【问题描述】:
我在我的案例陈述中遇到了错误。现在,在我参与的项目中使用它之前,我正在针对 NorthWind DB 对其进行测试。 我知道我应该使用 IF/ELSE,它适用于 IF/ELSE,唯一的问题是我必须在函数中执行此操作,而不是使用存储过程。 据我了解,在使用表值函数时我必须使用 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
抛出的错误是
消息 156,级别 15,状态 1,第 7 行 关键字“case”附近的语法不正确。
消息 156,级别 15,状态 1,第 11 行 关键字“when”附近的语法不正确。
消息 102,级别 15,状态 1,第 14 行 'end' 附近的语法不正确。
我也试过了……
case @PreAQ
when = 0
then...
然后我得到同样的错误
编辑
这与我的函数将在工作中执行的操作类似(除了过滤器和表格不同,但这仍然使用 NorthWind 作为测试数据库,请注意如何取决于“@PreAQ”编号,我需要它运行语句。我正在尝试这样做...
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
【问题讨论】:
-
想一想:有了函数,就提前知道了返回的表结构。如果允许您根据参数从具有不同结构的两个不同表中返回,这将如何工作?
-
@hvd,你是对的。我做了一个编辑,所以它来自同一张桌子。这应该可以消除任何误解。在项目中它将使用一个特定的表,现在测试代码反映了这一点。我不是sql高手,从来没用过CASE或者函数,用过存储过程,但是不会用
-
哪个 RDBMS?语法各不相同。我认为您需要最后一个版本,但像这样:
case @PreAQ when 0 then ...(无 =)。 -
@Turophile,MS SQL2012。我也尝试过这种方式并得到相同类型的错误(我确实省略了 = 符号)
-
啊,SQL-Server?然后你需要
something = CASE WHEN x=y THEN a WHEN x=w THEN b ELSE c END。在您的简单示例中,设置变量@match并使用单个 SQL 语句select * from Contacts where ContactTitle like @match会更容易。
标签: sql sql-server-2012 logic sql-function