小编典典

在SQL SERVER中的排序和用例

sql

我需要在存储过程中按功能排序。将值发布到Web服务,并基于该值我必须以某种方式对结果进行排序,即

当ColName由ColName发布订单时ColName2由ColName2发布订单时

我一直在寻找使用Case的方法,但出现错误:

  Incorrect syntax near '@version' 
  ORDER BY CASE 
  WHEN @OrderBy ='Seller (code)' THEN A_SNO 
  WHEN @OrderBy ='Lot' THEN A_LOTNO 
  WHEN @OrderBy ='Ring Type' THEN RN_NUM 
  WHEN @OrderBy ='Aim Error Code' THEN AimRejectionCode 
  ELSE A_SNO END

  DECLARE @version varchar(50)
  SET @version = (SELECT DBVERSION FROM MSYSCFG)
  PRINT 'New Version = ' + @version

抱歉,我是新来的,并且使用sql server2008。任何帮助都感谢UPDATE:提供了附加代码。当我遗漏了最后三行时,我得到一个错误

 Incorrect synatx near END

UPDATE2:我已将ORDER BY更改为以下内容:

ORDER BY 
    CASE @OrderBy
        WHEN @OrderBy = 'Seller (code)' THEN A_SNO
        WHEN @OrderBy = 'Lot' THEN A_LOTNO
        WHEN @OrderBy = 'Aim Error Code' THEN AimRejectionCode
    END
    , CASE @OrderBy WHEN 'Ring Type' THEN RingTypeFlag
    END
    , A_SNO

前三个是varchar,另一个是int类型。这给我所有三个’=’下的红线,错误描述为: 'incorrect syntax near '='
并且在ORDER BY下给红线给出错误描述为:

'A constant expression was encountered in the ORDER BY list, position 3'

请注意,当我删除最终的, A_SNO“排序依据”错误时,但仍收到=语法错误


阅读 190

收藏
2021-03-17

共1个答案

小编典典

CASE是一个 表达式
,必须产生一个明确定义的类型的结果。因此,只要所有列的类型都兼容,就可以将它们全部放入一个CASE表达式中。

如果 不是 这种情况,则需要将其拆分并使用 多个
表达式。假设Col1并且Col3具有兼容的类型(无论是相同的还是您很乐意将一个转换为另一种),Col2并且Col4具有不兼容的类型(两者之间以及与Col1和之间Col3),那么我们需要
三个 表达式:

ORDER BY 
    CASE @OrderBy
        WHEN 'Col1' THEN Col1
        WHEN 'Col3' THEN Col3
    END
    , CASE @OrderBy WHEN 'Col2' THEN Col2 END
    , CASE @OrderBy WHEN 'Col4' THEN Col4 END
    , Col1

(我还添加了一个最终表达式,Col1以便您仍然可以进行“后备”排序)

对于CASE上面的每个表达式,如果没有匹配项,则表达式返回NULL-并且所有NULLs一起排序,因此整个CASE表达式对排序没有整体影响。


来自CASE

退货类型

result_expressions 和可选的 else_result_expression中 的类型集中返回最高优先级。

2021-03-17