SQL Row_number()中的Case语句Order By子句不处理varchar和int值

时间:2008-11-06 11:13:37

标签: sql-server sql-order-by row-number

为什么这不起作用?

DECLARE @temp table
(ShipNo int,
 Supplier varchar(10)
)

INSERT INTO @temp VALUES (1,'CFA')
INSERT INTO @temp VALUES (1, 'TFA')
INSERT INTO @temp VALUES (2, 'LRA')
INSERT INTO @temp VALUES (2, 'LRB')
INSERT INTO @temp VALUES (3, 'ABC')
INSERT INTO @temp VALUES (4, 'TFA')

Declare @OrderBy varchar(255)
sET @OrderBy = 'Supplier'



SELECT ROW_NUMBER() OVER (ORDER BY 
CASE @OrderBy
 WHEN 'Supplier' THEN Supplier
 WHEN 'ShipNo' THEN ShipNo
END
) AS RowNo,
ShipNo,
Supplier
FROM @temp

但是,如果你将ShipNo转换为Case语句中的varchar,它是否有效?

2 个答案:

答案 0 :(得分:4)

我知道这是一个老帖子,但这适用于任何一个在这个问题上挣扎并正在寻找解决方案的人:

SELECT ROW_NUMBER() OVER (ORDER BY  
CASE @OrderBy 
 WHEN 'Supplier' THEN Supplier
END
CASE @OrderBy
 WHEN 'ShipNo' THEN ShipNo 
END 
)

基本上你将每个字段放在自己的情况下。仅当它们的数据类型或字段内的值对于两列都不同或者当您收到错误(例如

)时才执行此操作 尝试将int转换为varchar或将varchar转换为int ..

时,

转换失败

答案 1 :(得分:1)

来自联机丛书:

CASE
WHEN Boolean_expression THEN result_expression 
    [ ...n ] 
[ 
    ELSE else_result_expression 
] 
END

“else_result_expression和任何result_expression的数据类型必须相同或必须是隐式转换。”

因此,Supplier和ShipNo必须是相同的数据类型。