我需要在存储过程中按功能排序。将值发布到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下给红线给出错误描述为:
'incorrect syntax near '='
'A constant expression was encountered in the ORDER BY list, position 3'
请注意,当我删除最终的, A_SNO“排序依据”错误时,但仍收到=语法错误
, A_SNO
CASE是一个 表达式 ,必须产生一个明确定义的类型的结果。因此,只要所有列的类型都兼容,就可以将它们全部放入一个CASE表达式中。
CASE
如果 不是 这种情况,则需要将其拆分并使用 多个 表达式。假设Col1并且Col3具有兼容的类型(无论是相同的还是您很乐意将一个转换为另一种),Col2并且Col4具有不兼容的类型(两者之间以及与Col1和之间Col3),那么我们需要 三个 表达式:
Col1
Col3
Col2
Col4
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表达式对排序没有整体影响。
NULL
来自CASE:
退货类型 从 result_expressions 和可选的 else_result_expression中 的类型集中返回最高优先级。
从 result_expressions 和可选的 else_result_expression中 的类型集中返回最高优先级。