我有一个查询来获取基于讲师的课程详情。用户可以选择多个教师。所以我给了教师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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。"为什么会出现此错误?任何其他方式来执行相同的查询?
答案 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
其他最佳做法: