SQL自定义顺序依据

Bob*_*Bob 5 sql-order-by sql-server-2008

我不明白为什么这不起作用:

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
    from @TempExportList a
    join tblAnswers b
    on a.QuestionID = b.QuestionID
    where a.PaperID=@PaperID
    order by (case when a.QuestionName='A' then 0
                   when a.QuestionName='B' then 1
                   else a.QuestionID
              end)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误 -

如果指定了SELECT DISTINCT,则ORDER BY项必须出现在选择列表中.

但这很好用:

select distinct a.QuestionID,a.QuestionName,b.AnswerID,b.AnswerName
    from @TempExportList a
    join tblAnswers b
    on a.QuestionID = b.QuestionID
    where a.PaperID=@PaperID
    order by a.QuestionID
Run Code Online (Sandbox Code Playgroud)

Luk*_*keH 8

错误消息完美地解释了问题.

在第一个示例中,ORDER BY项目 - CASE WHEN ... END- 不会出现在SELECT列表中.

在第二个示例中,ORDER BY项目 - a.QuestionID- 确实出现在SELECT列表中.

要修复第一个示例,您需要执行以下操作:

SELECT DISTINCT a.QuestionID, a.QuestionName, b.AnswerID, b.AnswerName,
                CASE WHEN a.QuestionName = 'A' THEN 0
                     WHEN a.QuestionName = 'B' THEN 1
                     ELSE a.QuestionID
                END
FROM @TempExportList AS a
    JOIN tblAnswers AS b
        ON a.QuestionID = b.QuestionID
WHERE a.PaperID = @PaperID
ORDER BY CASE WHEN a.QuestionName = 'A' THEN 0
              WHEN a.QuestionName = 'B' THEN 1
              ELSE a.QuestionID
         END
Run Code Online (Sandbox Code Playgroud)