在sql server中使用where子句的问题

时间:2015-06-22 13:01:26

标签: sql sql-server

我有一个查询来获取基于讲师的课程详情。用户可以选择多个教师。所以我给了教师ID作为nvarchar值(' 1000,1001,1002'等等)。预期的ouptut是,当我给出讲师id为null时,需要返回所有记录(无过滤)需要为给定的instructorid返回其他记录。所以我已经尝试过以下方式。我创建了一个函数来将instructorid作为一个表。然后我在查询下执行。

select *from class c
where c.InstructorID  in 
(case  when @InstructorID is null then c.InstructorID else  
        (select value from #instructors)   end)

(#讲师是持有教师ID的表格)。但是我在执行存储过程时遇到错误。 "子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。"为什么会出现此错误?任何其他方式来执行相同的查询?

4 个答案:

答案 0 :(得分:3)

使用这种方式:

where @InstructorID is null OR c.InstructorID  in (select value from #instructors)

但是,我不确定您在哪里使用参数@InstructorID进行过滤。

答案 1 :(得分:1)

您可以使用最大或最小功能。试试这个查询

select *from class c where c.InstructorID in (case when @InstructorID is null then c.InstructorID else (select max(value) from #instructors) end)

答案 2 :(得分:1)

您可以在子查询中添加Order和TOP 1,只返回一行,如下所示

select TOP 1 value from #instructors order by value desc 

答案 3 :(得分:0)

这是对您描述的方案进行编码的最佳方式。考虑避免在不需要的情况下增加代码的复杂性。

IF (@InstructorID IS NULL)
BEGIN
    SELECT  *
    FROM    Class c
END
ELSE
BEGIN 
    SELECT  *
    FROM    Class c
    WHERE   InstructorID = @InstructorID
END

其他最佳做法:

  1. 考虑显示列的离散列表而不是 使用' *'提高绩效。
  2. 对SQL保留字使用缩进和大写是使代码更易于阅读和理解的最佳实践