【问题标题】:Operand type clash when using ORDER BY CASE使用 ORDER BY CASE 时的操作数类型冲突
【发布时间】:2014-07-15 18:26:18
【问题描述】:

我在存储过程中有一个 SELECT 语句,它根据变量的值产生不同的 ORDER BY 结果:

ALTER PROCEDURE [dbo].[myProc]

    @randomAnswers bit = 0

AS
    SELECT
        ab.answerID, -- int
        ab.someCol   -- nvarchar(max)
    FROM
        tbl_ABC ab 
    ORDER BY
        CASE WHEN @randomAnswers = 1 THEN 
            NEWID()
        ELSE 
            ab.answerID
        END;

错误是

操作数类型冲突:uniqueidentifier 与 int 不兼容

我该如何克服这个问题?在其他网站上,我看到了非常相似的方法,没有错误。 谢谢。

【问题讨论】:

  • 如果你将answerID 设置为uniqueidentifier 类型不会产生错误,但既然有,你不能这样做。可以创建随机的int 值吗?

标签: sql-server tsql sql-server-2012


【解决方案1】:

按两列排序。

ORDER BY CASE WHEN @RandomAnswers = 1 THEN NEWID() END,
         ab.answerID

@RandomAnswers = 0 时第一列将为空,这使得第二列成为有效的按列排序。

【讨论】:

  • 谢谢。如果@RandomAnswers = 0 是否会按answerID 排序,然后忽略NEWID()?我只是不太明白这里发生了什么......
  • @EvilDr 添加了更多细节。
  • 啊,所以语句的 ORDER BY 部分实际上在后台创建了一个 NEWID 列?
  • 好吧,case 语句是 order by 子句中的第一列。然后是逗号,后跟第二列。如果第一列中的值相等,行将按第二列排序。
  • 这实际上工作得非常好。在玩耍时,我可以在不同的时间获得各种随机性,例如ORDER BY fkID, someCol, CASE WHEN @random = 1 THEN NEWID() END, answerID。太棒了,非常感谢 - 一个真正的学习经验......
【解决方案2】:

试试这个:

ALTER PROCEDURE [dbo].[myProc]
    @randomAnswers bit = 0
AS
    SELECT ab.answerID,
           ab.someCol
    FROM tbl_ABC ab
    ORDER BY CASE WHEN @randomAnswers = 1 THEN CHECKSUM(NEWID()) ELSE ab.answerID END 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多