按 <int or varchar> 排序

ORDER BY <int or varchar>

我在存储过程中有一个查询,需要按整数列或 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

为了清楚起见,我的 table 结构是这样的(省略了不相关的列):

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 子句中的每个 case 都必须具有相同的数据类型。我知道我可以将所有内容都转换为 varchar,但是如果我按 CONVERT(varchar,ItemCode) 排序,我会得到奇怪的排序:

Chicquita    1
Plantain     -1 
DelMonte     2

是否可以在某些情况下按 varchar 字段排序,而在其他情况下按整数排序?

问题是 CASE return 是单一类型。所以,只需在 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 子句,因此它们 return NULL 表示不匹配的值。