我在存储过程中有一个查询,需要按整数列或varchar
列进行排序,具体取决于传递给过程的其中一个参数。
我将此作为我的ORDER BY
条款:
...
ORDER BY
CASE @ReportType
WHEN 1 THEN
ItemName + SubItemName
WHEN 2 THEN
ItemName + SubItemName
WHEN 3 THEN
SubItemName
WHEN 4 THEN
CONVERT(int,ItemCode)
ELSE
ItemName
END
为清楚起见,我的表结构是这样的(省略了不相关的列):
ItemName ItemCode SubItemName SubItemCode
Apple AA1 Fuji FJ1
Apple AA1 Gala GL1
Chicquita 1
DelMonte 2
Plantain -1
Orange OR1 Satsuma SS3
Orange OR1 Valencia VL2
如果我尝试使用@ReportType运行查询为1,2或4,一切正常,但如果我传递3,则会收到错误:
Conversion failed when converting the varchar value 'Orange' to data type int.
我相信这是因为ORDER BY
子句中的每个案例都必须具有相同的数据类型。我知道我可以将所有内容转换为varchar,但如果按CONVERT(varchar,ItemCode)
排序,我会得到时髦的排序:
Chicquita 1
Plantain -1
DelMonte 2
是否可以在某些情况下按varchar字段排序,但在其他情况下是整数?
答案 0 :(得分:3)
问题是CASE
返回单一类型。因此,只需在order by
中使用多个键:
ORDER BY (CASE WHEN @ReportType IN (1, 2) THEN ItemName + SubItemName END),
(CASE WHEN @ReportType = 3 THEN SubItemName END),
(CASE WHEN @ReportType = 4 THEN CONVERT(int, ItemCode) END),
ItemName
CASE
表达式没有ELSE
子句,因此对于不匹配的值,它们会返回NULL
。